C# Dynamic特性
C# 4.0 dynamic:聲明動態對象
dynamic關鍵字用于聲明一個動態對象,然后通過該動態對象去調用方法或讀寫屬性。這是C#4.0 添加的特性。官方解釋:dynamic類型是幫助我們繞過編譯進行類型檢查,相反這些操作是在運行時處理。
兩個缺點
新功能有兩個缺點:1)VS不會只能提示,只用依靠你自己了,因為鬼才知道你引用的未知對象中有哪些操作方法,只有運行時Running才可以知道。2)運行時間變慢,反射的封裝(自動反射),反射的效率不高。
應用場景
在使用C# 2.0或3.0的時候,如果一個對象需要在運行時才能確定,并且沒有接口和基類方面的信息,那我們一般使用反射技術來調用這個未知對像的方法或屬性,而C# 4.0提供的dynamic可以幫我們簡化這些工作。假設我們的程序會在運行時取得一個不確定類型的對象,但這個對象一定會有個Print()方法,我們需要調用這個方法打印出一些信息,那么在C# 4.0下面,我們可以用下面的兩句代碼來實現這個需求。
dynamic unknowObj = GetDymanicObject();
unknowObj.Print();
這種解決方式比起用反射調用Print方法,應該簡潔很多吧?程序員要做的就是別把方法名Print()打錯,VS2010是不會為dynamic對象提供智能提示的,因為VS不知道運行時這個unknowObj會是什么。
到這里,應該有不少的朋友可以從這個例子上看出,當程序編譯到unknowObj.Print()的時候,VS會幫我們生成反射的代碼,用反射的方式去調用Print這個方法,實質上就是幫我們自動反射了。
如果能理解這一點,那也就不難理解C#為啥要搞dynamic這個既沒智能感知,運行又慢的怪物出來了。
按New features in CSharp 4的說法,dymanic主要應用于下面的場景:
1、自動反射
2、COM組件互操作
3、混合編程,例如IronRuby和IronPython
4、處理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
總結
以上是生活随笔為你收集整理的C# Dynamic特性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我写的第一个CodeSmith模板(添加
- 下一篇: os.chdir()