dynamic关键字用于声明一个动态对象,而后经过该动态对象去调用方法或读写属性。这是C#4.0 添加的特性。官方解释:dynamic类型是帮助咱们绕过编译进行类型检查,相反这些操做是在运行时处理。程序员
新功能有两个缺点:1)VS不会只能提示,只用依靠你本身了,由于鬼才知道你引用的未知对象中有哪些操做方法,只有运行时Running才能够知道。2)运行时间变慢,反射的封装(自动反射),反射的效率不高。shell
在使用C# 2.0或3.0的时候,若是一个对象须要在运行时才能肯定,而且没有接口和基类方面的信息,那咱们通常使用反射技术来调用这个未知对像的方法或属性,而C# 4.0提供的dynamic能够帮咱们简化这些工做。假设咱们的程序会在运行时取得一个不肯定类型的对象,但这个对象必定会有个Print()方法,咱们须要调用这个方法打印出一些信息,那么在C# 4.0下面,咱们能够用下面的两句代码来实现这个需求。编程
dynamic unknowObj = GetDymanicObject();ide
unknowObj.Print();spa
这种解决方式比起用反射调用Print方法,应该简洁不少吧?程序员要作的就是别把方法名Print()打错,VS2010是不会为dynamic对象提供智能提示的,由于VS不知道运行时这个unknowObj会是什么。code
到这里,应该有很多的朋友能够从这个例子上看出,当程序编译到unknowObj.Print()的时候,VS会帮咱们生成反射的代码,用反射的方式去调用Print这个方法,实质上就是帮咱们自动反射了。对象
若是能理解这一点,那也就不难理解C#为啥要搞dynamic这个既没智能感知,运行又慢的怪物出来了。blog
按New features in CSharp 4的说法,dymanic主要应用于下面的场景:接口
一、自动反射string
二、COM组件互操做
三、混合编程,例如IronRuby和IronPython
四、处理Html DOM对象
若是有处理过上面这些工做的朋友们,应该不难理解了吧。
具体的内容,还请大伙本身看看New features in CSharp 4,里面说得比较详细。
以上就介绍了C# 4.0 dynamic的用途。
下面演示几个例子进一步说明这个关键字的使用,以及实用的主意事项。
1)简单演示一个得到变量值的例子。
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 dynamic dyn = 1; 6 object obj = 1; 7 8 // Rest the mouse pointer over dyn and obj to see their 9 // types at compile time. 10 System.Console.WriteLine(dyn.GetType()); 11 System.Console.WriteLine(obj.GetType()); 12 } 13 }
2)演示一个简单获取程序集对象的例子(使用Shell32下的ShellClass.Application得到文件属性)
1 //得到程序的对象(经过程序的ProgramID) 2 System.Type objType = System.Type.GetTypeFromProgID("Shell.Application"); 3 //根据得到的ProgramID对象程序集建立一个对象 4 dynamic shell = System.Activator.CreateInstance(objType); 5 //文件路径 6 dynamic folder = shell.NameSpace(path.Substring(0, path.LastIndexOf("\\"))); 7 //文件名称 8 dynamic folderitem = folder.ParseName(path.Substring(path.LastIndexOf("\\") + 1)); 9 if (Environment.OSVersion.Version.Major >= 6) 10 { 11 return folder.GetDetailsOf(folderitem, 27); 12 } 13 else 14 { 15 return folder.GetDetailsOf(folderitem, 21); 16 } 17