zoukankan      html  css  js  c++  java
  • 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方法:
    "+i1);
                dynamic dy = new Person();
                i1=dy.Add(10, 3);
                Console.WriteLine("通过Dynamic来调用Add方法:
    " + 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();
            }

    Hold on, everything is possible.
  • 相关阅读:
    注解的作用
    962. Maximum Width Ramp
    594. Longest Harmonious Subsequence
    1042. Flower Planting With No Adjacent
    419. Battleships in a Board
    1041. Robot Bounded In Circle
    leetcode 395. Longest Substring with At Least K Repeating Characters(高质量题)
    leetcode 44. Wildcard Matching(模糊匹配)
    HEU预热赛
    780. Reaching Points
  • 原文地址:https://www.cnblogs.com/student-note/p/6160647.html
Copyright © 2011-2022 走看看