首先看一下Dynamic的定义

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

   先来看一个简单的应用

  1. dynamic d1 = ;
  2. dynamic d2 = "我是动态类型";
  3. Console.WriteLine(d1+d2);

  下面来看看Dynamic和反射的不同之处,如下:

    我们可以看到Dynamic可以一定程度的简化反射调用的步骤,并且Dynamic会自动加载,也就是我们做的少,那么编译器就做的多.

    但编译器会优化Dynamic类型,所以说Dynamic在一定程度上优于Dynamic

  1. Person p = new Person();
  2. Type t = p.GetType();
  3. int i1 = (int)t.InvokeMember("Add", BindingFlags.InvokeMethod, null, p, new object[] { , });
  4. Console.WriteLine("通过反射来调用Add方法:\n"+i1);
  5. dynamic dy = new Person();
  6. i1=dy.Add(, );
  7. Console.WriteLine("通过Dynamic来调用Add方法:\n" + i1);
  8. Console.Read();

  通过Dynamic动态创建对象

  1. class MyDynamic : DynamicObject
  2. {
  3. private Dictionary<string, object> _Dynamic = new Dictionary<string, object>();
  4.  
  5. public override bool TryGetMember(GetMemberBinder binder, out object result)
  6. {
  7. bool re = false;
  8. if (_Dynamic.ContainsKey(binder.Name))
  9. {
  10. result = _Dynamic[binder.Name];
  11. re = true;
  12. }
  13. else
  14. result = "对不起属性不存在哦!!!";
  15. return re;
  16. }
  17. public override bool TrySetMember(SetMemberBinder binder, object value)
  18. {
  19. _Dynamic[binder.Name] = value;
  20. return true;
  21. }
  22. public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
  23. {
  24. return base.TryInvokeMember(binder, args, out result);
  25. }
  26. }
  1. static void Main(string[] args)
  2. {
  3. dynamic d = new MyDynamic();
  4. d.name = "";
  5. Func<int, int, int> dd = (d1, d2) => { return d1 + d2; };
  6. d.add = dd;
  7. Console.WriteLine(d.add(, ));
  8. Console.WriteLine(d.name);
  9. Console.Read();
  10. }

Learn_Dynamic的更多相关文章

随机推荐

  1. P44、面试题4:替换空格

    题目:请实现一个函数,把字符串中的每个空格替换成“%20”.例如输入“We are happy.”,则输出“We%20are%20happy.”. 如果用java string类中提供的replace ...

  2. android 引用 project以及下拉刷新开源类库Android-PullToRefresh 的使用

    Android-PullToRefresh 是一个github上的开源下拉刷新类库, GitHub  .此外,该作者还有另外一个实用度和关注量极高的项目–另一种Android ActionBar的实现 ...

  3. Redpine Signals RS9110-N-11-02 Wi-Fi解决方案

    Redpine Signals公司的RS9110-N-11-02是兼容IEEE 802.11bgn的Wi-Fi客户端模块,集成了MAC,基带处理器,RF收发器和功率放大器.和RS9110-LI MAC ...

  4. Android开发之ContentProvider的简单使用

    ContentProvider,内容提供者 官网结构图: 作为四大组件之一的ContentProvider,主要是用于应用间数据共享使用的. ContentProvider把应用的数据封装起来,然后提 ...

  5. 函数buf_LRU_free_from_unzip_LRU_list

    /******************************************************************//** Try to free an uncompressed ...

  6. 函数flst_add_last

    /********************************************************************//** Adds a node as the last no ...

  7. Java框架的思考

    目前的JAVA 企业级开发框架,我们常用的大致包括IOC AOP MVC ORM框架 1. IOC spring是一个非常棒的ico容器,其思想非常简单,用一个集合对象如MAP 来缓存对象(对象都是单 ...

  8. Oracle Data Guard

    DG 是 Oracle Data Guard 的简称.也就是Oracle11g的 数据卫士. 由于在工作中 Oracle和 SQL SERVER2008 同时都需要维护管理.给我的感觉这里的 DG 其 ...

  9. MemoryMappedFile 内存映射文件 msdn

    http://msdn.microsoft.com/zh-cn/library/dd997372%28v=vs.110%29.aspx 内存映射文件 .NET Framework 4.5 其他版本 1 ...

  10. Linux Vi 删除全部内容,删除某行到结尾,删除某段内容 的方法

    1.打开文件 vi filename 2.转到文件结尾 G 或转到第9行 9G 3.删除所有内容(先用G转到文件尾) ,使用: :1,.d 或者删除第9行到第200行的内容(先用200G转到第200行 ...