Learn_Dynamic

  首先看一下Dynamic的定义 

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

   先来看一个简单的应用

            dynamic d1 = 1;
            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[] { 2, 3 });
            Console.WriteLine("通过反射来调用Add方法:\n"+i1);
            dynamic dy = new Person();
            i1=dy.Add(10, 3);
            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 = "11111111111";
            Func<int, int, int> dd = (d1, d2) => { return d1 + d2; };
            d.add = dd;
            Console.WriteLine(d.add(3, 4));
            Console.WriteLine(d.name);
            Console.Read();
        }

 

posted @ 2016-12-11 21:30  夏风微凉  阅读(154)  评论(0)    收藏  举报