C#dynamic关键字(1)

一.object,var,dynamic的区别

        static void Main()
        {
            //var是C# 3中引入的,其实它仅仅只是一个语法糖. var本身并不是一种类型, 其它两者object和dynamic是类型。
            //var声明的变量在赋值的那一刻,就已经决定了它是什么类型。
            //object之所以能够被赋值为任意类型的原因,其实都知道,因为所有的类型都派生自object. 所以它可以赋值为任何类型:
            //dynamic它的特点是申明为dynamic类型的变量,不是在编译时候确定实际类型的, 而是在运行时。
            var a = 1;
            object b = 1;
            dynamic c = "1";
            //报错,类型已确认为int
            //a = new string[] { "1" };
            b = new string[] { "1" };
            //代码是能够通过编译的,但是会在运行时报错:
            c++;  
        }

二.dynamic的用法

        static void Main()
        {
            //1 直接使用该类型,可以非常方便的插入属性, 方法
            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();
        }
        static void Main()
        {
            //2 枚举所有成员
            dynamic person = new System.Dynamic.ExpandoObject();
            person.Name = "cary";
            person.Age = 25;
            person.ShowDescription = new Func<string>(() => person.Name + person.Age);
            foreach (var property in (IDictionary<String, Object>)person)
            {
                Console.WriteLine(property.Key + ": " + property.Value);
            }
            Console.ReadLine();
        }
    class Program
    {
        static void Main()
        {
            //3 简化反射
            //常用的处理反射的例子:
            GetCalculator _getcalculator = new GetCalculator();
            object calc = _getcalculator;
            Type calcType = calc.GetType();
            object res = calcType.InvokeMember("Add", BindingFlags.InvokeMethod, null, _getcalculator, new object[] { 10, 20 });
            int sum = Convert.ToInt32(res);
            //使用dynamic之后:
            dynamic calc1 = _getcalculator;
            int sum1 = calc1.Add(10, 20);

            Console.WriteLine("sum的值为{0},sum1的值为{1}", sum, sum1);
            Console.ReadLine();
        }
    }

    class GetCalculator
    {
        public int Add(int a, int b)
        {
            return a + b;
        }
    }

三.使用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);
原文地址:https://www.cnblogs.com/lgxlsm/p/5336328.html