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的更多相关文章
随机推荐
- P44、面试题4:替换空格
题目:请实现一个函数,把字符串中的每个空格替换成“%20”.例如输入“We are happy.”,则输出“We%20are%20happy.”. 如果用java string类中提供的replace ...
- android 引用 project以及下拉刷新开源类库Android-PullToRefresh 的使用
Android-PullToRefresh 是一个github上的开源下拉刷新类库, GitHub .此外,该作者还有另外一个实用度和关注量极高的项目–另一种Android ActionBar的实现 ...
- Redpine Signals RS9110-N-11-02 Wi-Fi解决方案
Redpine Signals公司的RS9110-N-11-02是兼容IEEE 802.11bgn的Wi-Fi客户端模块,集成了MAC,基带处理器,RF收发器和功率放大器.和RS9110-LI MAC ...
- Android开发之ContentProvider的简单使用
ContentProvider,内容提供者 官网结构图: 作为四大组件之一的ContentProvider,主要是用于应用间数据共享使用的. ContentProvider把应用的数据封装起来,然后提 ...
- 函数buf_LRU_free_from_unzip_LRU_list
/******************************************************************//** Try to free an uncompressed ...
- 函数flst_add_last
/********************************************************************//** Adds a node as the last no ...
- Java框架的思考
目前的JAVA 企业级开发框架,我们常用的大致包括IOC AOP MVC ORM框架 1. IOC spring是一个非常棒的ico容器,其思想非常简单,用一个集合对象如MAP 来缓存对象(对象都是单 ...
- Oracle Data Guard
DG 是 Oracle Data Guard 的简称.也就是Oracle11g的 数据卫士. 由于在工作中 Oracle和 SQL SERVER2008 同时都需要维护管理.给我的感觉这里的 DG 其 ...
- MemoryMappedFile 内存映射文件 msdn
http://msdn.microsoft.com/zh-cn/library/dd997372%28v=vs.110%29.aspx 内存映射文件 .NET Framework 4.5 其他版本 1 ...
- Linux Vi 删除全部内容,删除某行到结尾,删除某段内容 的方法
1.打开文件 vi filename 2.转到文件结尾 G 或转到第9行 9G 3.删除所有内容(先用G转到文件尾) ,使用: :1,.d 或者删除第9行到第200行的内容(先用200G转到第200行 ...