C# Dynamic关键字之:调用属性、方法、字段的实现方法
class Product
{
public string name;
public int Id { get; set; }
public void ShowProduct()
{
Console.WriteLine("Id={0} ,Name={1}", Id, name);
}
}
static void Main(string[] args)
{
//dynamic对象
dynamic dynProduct = new Product();
//设置name字段
dynProduct.name = "n1";
//设置Id属性
dynProduct.Id = 1;
dynProduct.Id = dynProduct.Id + 3;
//调用ShowProduct方法
dynProduct.ShowProduct();
Console.ReadLine();
}
输出如下:
修改dynProduct.Id=”1”,此时"1”是字符串
运行:
因为product的Id属性是int型
修改dynProduct.ShowProducT(); 运行:
因为product 包含ShowProduct 的方法,但是并没有包含ShowProducT的方法,
所以dynamic不支持大小写不同。根本原因是因为C#也不支持。
修改Product中name的修饰符:将Public改为private:
private string name;
再次运行代码:
因为name是private,外部无法访问。。。
但是反射好像是可以的啊?
那么尝试下反射吧:
Type productType = typeof(Product);
Product p = new Product();
FieldInfo fi = productType.GetField("name",
BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly);
fi.SetValue(p, "通过反射设置的值");
运行,结果如下:
因为在某些安全限制条件下,是不运行读取和设置私有字段的,例如在silverlight中。所以微软大概出于对这一点的考虑,所以dynamic不支持私有字段的读取和设置吧,以上纯属个人猜想。
相关推荐
-
详解C# 匿名对象(匿名类型)、var、动态类型 dynamic
随着C#的发展,该语言内容不断丰富,开发变得更加方便快捷,C# 的锋利尽显无疑.C# 语言从诞生起就是强类型语言,这一性质到今天不曾改变,我想以后也不会变.既然是强类型语言,那编写任一程序均要求满足下面的基本条件: 1.变量声明必须指明其类型 2.变量类型明确后,其类型在Runtime亦不能改变 代码如下: public class Student { public string Name { get; set; } public int Age { get; set; } public str
-
C#动态对象(dynamic)详解(实现方法和属性的动态)
C#的动态对象的属性实现比较简单,如果要实现动态语言那种动态方法就比较困难,因为对于dynamic对象,扩展方法,匿名方法都是不能用直接的,这里还是利用对象和委托来模拟这种动态方法的实现,看起来有点javascript的对象味道: 1) 定义一个委托,参数个数可变,参数都是object类型:这里的委托多有个dynamic参数,代表调用这个委托的动态对象本身. public delegate object MyDelegate(dynamic Sender, params object[] PMs
-
C# Dynamic之:ExpandoObject,DynamicObject,DynamicMetaOb的应用(上)
ExpandoObject:表示一个对象,该对象包含可在运行时动态添加和移除的成员. 复制代码 代码如下: dynamic dynEO = new ExpandoObject();dynEO.number = 10;dynEO.Increment = new Action(() => { dynEO.number++; }); Console.WriteLine(dynEO.number);dynEO.Increment();Console.WriteLine(dynEO.number); dy
-
C# 反射与dynamic最佳组合示例代码
在 C# 中反射技术应用广泛,至于什么是反射.........你如果不了解的话,请看下段说明,否则请跳过下段.广告一下:喜欢我文章的朋友请关注一下我的blog,这也有助于提高本人写作的动力. 反射:当你背对一个美女或帅哥却不能回头仔细观察研究时(纯属虚构,如有巧合.纯属雷同),一面小镜子就能满足你的需求.在 C# 编程过程中也经常遇到类似的情况:有一个别人写的 dll 类库你想使用却没程序文档资料......此时通过 C# Runtime 提供的功能,你可以把该 dll 类库加载到你的程序中,并
-
C# dynamic关键字的使用方法
C#是一种类型安全的编程语言(所有表达式都能解析成某个类型的实例,在编译器生成的代码中,只会执行对这个类型有效的操作),和非类型安全的语言相比,类型安全的优势就体现出来了:1.许多错误能在编译时检测到,取保代码在执行它之前是正确的.2.编译时语言通常能生成更小,更快的代码.(在编译时进行更多的假设,并在IL和元数据中落实那些假设) 为了方便开发人员使用反射或者与基本组件通信,dynamic诞生了!一下代码展示了如何利用反射在一个String目标("根据我找类型")上调用一个方法(&qu
-
C# Dynamic关键字之:解析dynamic就是Object
C# 4.0提供了一个dynamic 关键字,那么什么是dynamic,究竟dynamic是如何工作的呢? 从最简单的示例开始: 复制代码 代码如下: static void Main(string[] args) { dynamic dyn = 1; object obj = 1; //在编译时将鼠标放到 "dyn" 和"obj"中可以发现: // dyn:局
-
C# Dynamic关键字之:调用属性、方法、字段的实现方法
新建类Product: 复制代码 代码如下: class Product{ public string name; public int Id { get; set; } public void ShowProduct() { Console.WriteLine("Id={0} ,Name={1}", Id, name); }} Main方法代码如下: 复制代码 代码如下: static void Main(string[] args){ /
-
Java 深入学习static关键字和静态属性及方法
目录 static关键字 静态属性 静态方法 静态方法的使用 静态代码块 static关键字 在定义一个类时,只是描述某事物的特征和行为,并没有产生具体的数据,只有通过new关键字创建该类的实例对象时,才会开辟栈内存及内存,在堆内存中要保存对象的属性时,每个对象会有自己的属性. 如果希望某些属性被所有对象共享,就必须将其声明为static属性,如果属性使用了static关键字进行修饰,则该属性可以直接使用类名称进行调用,static关键字还可以修饰成员方法. 静态属性 如果在Java程序中使用s
-
Android JNI 调用时缓存字段和方法ID示例
在 JNI 去调用 Java 的方法和访问字段时,最先要做的操作就是获得对应的类以及对应的方法 id. 事实上,通过 FindClass .GetFieldID.GetMethodID 去找到对应的信息是很耗时的,如果方法被频繁调用,那么肯定不能每次都去查找对应的信息,有必要将它们缓存起来,在下一次调用时,直接使用缓存内容就好了. 缓存有两种方式,分别是使用时缓存和初始化时缓存. 使用时缓存 使用时缓存,就是在调用时查找一次,然后将它缓存成 static 变量,这样下次调用时就已经被初始化过了.
-
C# Dynamic关键字之:dynamic为什么比反射快的详解
Main方法如下: 复制代码 代码如下: static void Main(string[] args){ dynamic str = "abcd"; Console.WriteLine(str.Length); Console.WriteLine(); Console.WriteLine(str.Substring(1)); Console.ReadLine();} 运行,结果如下: 使用reflactor 反编译下,可以看到: 完整代码如下: 复制代码 代码如下:
-
PHP 面向对象程序设计之类属性与类常量实现方法分析
本文实例讲述了PHP 面向对象程序设计之类属性与类常量.分享给大家供大家参考,具体如下: 属性 (Properties) 类的变量成员叫做"属性",或者叫"字段"."特征",在本文档统一称为"属性".属性声明是由关键字 public,protected或者 private 开头,然后跟一个普通的变量声明来组成.属性中的变量可以初始化,但是初始化的值必须是常数,这里的常数是指 PHP 脚本在编译阶段时就可以得到其值,而不依赖于运
-
C#使用DllImport调用非托管的代码的方法
找到GetShortPathName的方法签名, DWORD GetShortPathName(LPCTSTR tpszLongPath,TPTSTR lpszShortPath,DWORD cchBuffer): 非托管及托管数据类型对应关系: LPCTSTR String LPTSTR StringBuilder DWORD int DllImport的导入规则: 1.方法名与Win API完全一样.如果在C#中调用时显示完全不同的方法名
-
从C#程序中调用非受管DLLs的方法
本文实例讲述了从C#程序中调用非受管DLLs的方法.分享给大家供大家参考.具体方法如下: 前言: 从所周知,.NET已经渐渐成为一种技术时尚,那么C#很自然也成为一种编程时尚.如何利用浩如烟海的Win32 API以及以前所编写的 Win32 代码已经成为越来越多的C#程序员所关注的问题.本文将介绍如何从C#代码中调用非受管DLLs.如果某个函数是一个带有串类型(char*)输出参数的Win32 API 或者是DLL输出函数,那么从C#中如何调用它呢?对于输入参数的情形问题到不大,但如何获取从参数
-
C#中dynamic关键字的正确用法(推荐)
dynamic是FrameWork4.0的新特性.dynamic的出现让C#具有了弱语言类型的特性.编译器在编译的时候不再对类型进行检查,编译期默认dynamic对象支持你想要的任何特性.比如,即使你对GetDynamicObject方法返回的对象一无所知,你也可以像如下那样进行代码的调用,编译器不会报错: dynamic dynamicObject = GetDynamicObject(); Console.WriteLine(dynamicObject.Name); Console.Writ
-
iOS开发中CAlayer层的属性以及自定义层的方法
CAlayer层的属性 一.position和anchorPoint 1.简单介绍 CALayer有2个非常重要的属性:position和anchorPoint @property CGPoint position; 用来设置CALayer在父层中的位置 以父层的左上角为原点(0, 0) @property CGPoint anchorPoint; 称为"定位点"."锚点" 决定着CALayer身上的哪个点会在position属性所指的位置 以自己的左上角为原点(0
随机推荐
- PHP 获取远程文件内容的函数代码
- jsp基础学习资料
- JS无限极树形菜单,json格式、数组格式通用示例
- win2008 r2 hyper-v虚拟机的安装使用图文教程第1/2页
- 令Apache中沉睡的无用进程自动退出的方法
- java web项目里ehcache.xml介绍
- 详解在spring boot中配置多个DispatcherServlet
- 深入分析C#中WinForm控件之Dock顺序调整的详解
- 常用的JQuery数字类型验证正则表达式整理
- MySQL中使用SQL语句对字段进行重命名
- PHP中for与foreach的区别分析
- Bootstrap模态框(modal)垂直居中的实例代码
- linux服务器系统中手动配置lamp服务器的经验分享
- java线程并发semaphore类示例
- JS实现标签页效果(配合css)
- 浅析c#范型中的特殊关键字where & default
- 快速解决ajax请求出错状态码为0的问题
- python twilio模块实现发送手机短信功能
- 移动端网页开发调试神器Eruda的介绍与使用技巧
- angular2实现统一的http请求头方法