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