• C# dynamic


    它是C#引入的新类型,它的特点是申明为dynamic类型的变量,不是在编译时候确定实际类型的, 而是在运行时。

    所以下面的代码是能够通过编译的,但是会在运行时报错:

    dynamic a = "test";
    a++;

    上面代码内部处理的过程是怎样的呢?

    首先, dynamic类型赋值为字符串"test", 运行++操作的时候,.net会去寻找当前的赋值类型string中是否支持++操作,发现不支持,出现异常。

    所以,如果这样修改一下,就可以让代码正常运行起来

    dynamic a = "test";
    a = 1;
    a++;

    dynamic的用法

    1 直接使用该类型,可以非常方便的插入属性, 方法

    复制代码
    static void Main(string[] args)
    {
        dynamic person = new System.Dynamic.ExpandoObject();
        person.Name = "cary";
        person.Age = 25;
        person.ShowDescription = new Func<string>(() => person.Name + person.Age);
     
        Console.WriteLine(person.Name + person.Age + person.ShowDescription());
        Console.ReadLine();
    }
    复制代码

    枚举所有成员

    foreach (var property in (IDictionary<String, Object>)dynEO)
    {
         Console.WriteLine(property.Key + ": " + property.Value);
    }

    3 简化反射

    常用的处理反射的例子:

    object calc = GetCalculator();
    Type calcType = calc.GetType();
    object res = calcType.InvokeMember( "Add", BindingFlags.InvokeMethod, null, new object[] { 10, 20 });
    int sum = Convert.ToInt32(res);

    使用dynamic之后:

     dynamic calc = GetCalculator();
     int sum = calc.Add(10, 20);

    使用dynamic的注意事项

    有了dynamic,.net就以及有了动态类型的优势,但是由于对于dynamic类型的所有操作,都是在运行时确定的,所有错误无法在编译时候出现,使用的时候,就需要非常小心。

    因为dynamic是类型,所以如果函数接受的是确定类型的参数,是不能传入dynamic类型的,这样会有编译错误。比如:

    复制代码
    public int Add(int a, int b){
        return a + b;
    }
    dynamic test1 = 1;
    dynamic test2 = 2;
    Add(test1, test2);
    复制代码
  • 相关阅读:
    【Java集合】试读LinkedList源码
    【Java集合】试读ArrayList源码
    类加载器ClassLoader的理解
    Spring中Bean的不同配置方式
    Spring中Bean的生命周期
    关于反射的一点理解
    Vector与ArrayList 的理解
    java多态的实现原理(JVM调用过程)(综合多篇文章,参考见文末)
    并发编程的模型分类(转载于https://link.zhihu.com/?target=http%3A//www.54tianzhisheng.cn/2018/02/28/Java-Memory-Model/)强烈推荐!
    Thread线程类
  • 原文地址:https://www.cnblogs.com/Javi/p/6755598.html
Copyright © 2020-2023  润新知