动态类型是从C#4才开始有的,随着DLR一起引人的。
大部分时候的行为如同object类型,对应的IL代码也是object类型。
它的特点是编译时会忽略在dynamic上进行的操作,如调用方法,读写属性等;
运行时才会转成确定的对象;还可以和Python等动态语言交互。这就是它的优势;
dynamic d= 1; d="a";
是可以正常运行的.dynamic d = new dynamic();
是错误的 ,正确的是 dynamic d2 = new ExpandoObject();
class A :IEnumerable<dynamic>
是错误的//错误
dynamic d=(x=>x+1);
//正确
dynamic d=(Func<int,int>)(x=>x+1);
var nums= Enamerable.Range(0,10);
dynamic d=4;
//错误
nums.Take(d);
和反射相比
如果一个确定的类型被转成了 object类型, 我们需要反射获取到方法,然后 method.Invoke(instance,null);
而动态类型可以直接 , obj.Method();
dynamic的可读性更高,代码更少 ,当方法需要传递参数时,就更明显了
简化了和 COM互操作
如果将COM互操作的类型 内嵌到程序集,则很多类型会自动转成 dynamic
和泛型相比
比泛型更灵活 ; 由于泛型没法添加 操作符重载约束,使用dynamic作为方法参数,可以解决这个问题。
原文:https://www.cnblogs.com/francisXu/p/13717036.html