Learn_Dynamic
首先看一下Dynamic的定义
Visual C# 2010 引入了一个新类型 dynamic。 该类型是一种静态类型,但类型为 dynamic 的对象会跳过静态类型检查。 大多数情况下,该对象就像具有类型 object 一样。 在编译时,将假定类型化为 dynamic 的元素支持任何操作。 因此,您不必考虑对象是从 COM API、从动态语言(例如 IronPython)、从 HTML 文档对象模型 (DOM)、从反射还是从程序中的其他位置获取自己的值。 但是,如果代码无效,则在运行时会捕获到错误。
先来看一个简单的应用
dynamic d1 = ;
dynamic d2 = "我是动态类型";
Console.WriteLine(d1+d2);

下面来看看Dynamic和反射的不同之处,如下:
我们可以看到Dynamic可以一定程度的简化反射调用的步骤,并且Dynamic会自动加载,也就是我们做的少,那么编译器就做的多.
但编译器会优化Dynamic类型,所以说Dynamic在一定程度上优于Dynamic
Person p = new Person();
Type t = p.GetType();
int i1 = (int)t.InvokeMember("Add", BindingFlags.InvokeMethod, null, p, new object[] { , });
Console.WriteLine("通过反射来调用Add方法:\n"+i1);
dynamic dy = new Person();
i1=dy.Add(, );
Console.WriteLine("通过Dynamic来调用Add方法:\n" + i1);
Console.Read();

通过Dynamic动态创建对象
class MyDynamic : DynamicObject
{
private Dictionary<string, object> _Dynamic = new Dictionary<string, object>(); public override bool TryGetMember(GetMemberBinder binder, out object result)
{
bool re = false;
if (_Dynamic.ContainsKey(binder.Name))
{
result = _Dynamic[binder.Name];
re = true;
}
else
result = "对不起属性不存在哦!!!";
return re;
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
_Dynamic[binder.Name] = value;
return true;
}
public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
{
return base.TryInvokeMember(binder, args, out result);
}
}
static void Main(string[] args)
{
dynamic d = new MyDynamic();
d.name = "";
Func<int, int, int> dd = (d1, d2) => { return d1 + d2; };
d.add = dd;
Console.WriteLine(d.add(, ));
Console.WriteLine(d.name);
Console.Read();
}

Learn_Dynamic的更多相关文章
随机推荐
- cache设计,以及多核造成的不一致性以及解决方案
http://www.360doc.com/content/11/1013/00/1317564_155625188.shtml http://blog.csdn.net/muxiqingyang/a ...
- gitHub for windows设置网络代理
在公司网络环境下使用gitHub,一直出错,因为公司使用的代理.但是gitHub for windows无法设置代理. 可以通过C:\Users\admin\.gitconfig中,添加代理. 添加: ...
- 移动端调试 weinre
weinre 是基于 Node 的工具,因此使用如下命令安装 weinre $ npm install -g weinre 用上面的命令将 weinre 安装到全局,然后就可以使用 weinre的命令 ...
- UNIX 网络编程第五章读书笔记
刚看完 UNIX 第五章内容,我想按照自己的方式将自己获得的知识梳理一遍,以便日后查看!先贴上一段简单的 TCP 服务器端代码: #include <sys/socket.h> #incl ...
- JXL读取Excel日期时间不准确
XL读取Excel日期时间多出了8个小时. Cell c = rs.getCell(j, i); if (c.getType() == CellType.DAT ...
- poj2352
纪念树状数组初步(……): 这题已经给了y升序,y相同时x升序,(yeah) 所以容易想到O(n^2)的模拟算法: 其实分析一下就是对于当前xi,统计之前有多少个小于等于xi(因为已经保证了没有相同坐 ...
- mysql CMAKE 参数说明
MySQL自5.5版本以后,就开始使用CMake编译工具了,因此,你在安装源文件中找不到configure文件是正常的.很多人下到了新版的MySQL,因为找不到configure文件,不知道该怎么继续 ...
- ToString() 格式化字符串
例如i=: i.ToString().PadLeft(,'); 固定长度为10,左不足补0,结果为0000000001:
- ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)
于ASP.NET MVC Preview5. 前一篇中我们已经了解了Action Filter 与 内置的Filter实现,现在我们就来写一个实例.就写一个防盗链的Filter吧. 首先继承自Filt ...
- HDU 4081 Qin Shi Huang's National Road System 最小生成树
分析:http://www.cnblogs.com/wally/archive/2013/02/04/2892194.html 这个题就是多一个限制,就是求包含每条边的最小生成树,这个求出原始最小生成 ...