C# Dynamic特性

 

C# 4.0 dynamic:聲明動態對象

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 }
View Code

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         
View Code
相關文章
相關標籤/搜索