咨詢(xún)電話(huà):023-6276-4481
熱門(mén)文章
電 話(huà):023-6276-4481
郵箱:broiling@qq.com
地址:重慶市南岸區(qū)亞太商谷6幢25-2
dynamic元類(lèi)型
C# 4.0將通過(guò)新的元類(lèi)型"dynamic"來(lái)添加對(duì)后期綁定的支持。任何直接聲明為這種類(lèi)型的變量,或者從函數(shù)中返回這種類(lèi)型的值,都將自動(dòng)地視為后期綁定。這類(lèi)似于在Visual Basic中把變量聲明為"object",不過(guò)它現(xiàn)在可以支持任何類(lèi)型系統(tǒng)了,不僅僅是CTS(通用類(lèi)型規(guī)范)和COM。
一個(gè)重要之處是,這個(gè)特性的目標(biāo)就是為了支持后期綁定,以及更多地為了支持近來(lái)流行的動(dòng)態(tài)綁定。動(dòng)態(tài)類(lèi)型明顯不是C#的一個(gè)特性,不過(guò)是為了支持動(dòng)態(tài)綁定的一個(gè)后果。
還要著重注意的一點(diǎn)是,反射并不是一種很好的替代方案。使用反射的問(wèn)題在于,需要處理各種各樣的類(lèi)型。使用Reflection命名空間調(diào)用方法的方式和在ScriptObject上調(diào)用方法的方式并不相同。尤其,Ruby/Python方法這樣的第三方方法。
dynamic ExpandoObject
熟悉js的朋友都知道js可以這么寫(xiě) :
var t = new Object();
t.Abc = "something";
t.Value = 243;
現(xiàn)在這個(gè)js動(dòng)態(tài)語(yǔ)言的特性,我們也可以在c#中使用了,前提是將一個(gè)變量聲明為ExpandoObject類(lèi)型。如下例:
static void Main(string[] args)
{
dynamic t = new ExpandoObject();
t.Abc = "abc";
t.Value = 10000;
Console.WriteLine("t's abc = {0},t's value = {1}", t.Abc, t.Value);
Console.ReadLine();
}
C# 4.0中新增了一個(gè)命名空間System.Dynamic來(lái)實(shí)現(xiàn)對(duì)此應(yīng)用的支持,這種用法的意義何在,現(xiàn)在我還不太清楚,也是是c#向動(dòng)態(tài)語(yǔ)言過(guò)渡的一種試探吧。以下展示的是dynamic可變類(lèi)型特性
dynamic d = 1;
Console.WriteLine(d.ToString());
d = new DateTime();
Console.WriteLine(d.ToString());
d = "szl";
Console.WriteLine(d.ToString());
dymanic應(yīng)用場(chǎng)景
按New features in CSharp 4的說(shuō)法,dymanic主要應(yīng)用于下面的場(chǎng)景:
1、自動(dòng)反射
2、COM組件互操作
3、混合編程,例如IronRuby和IronPython
4、處理Html DOM對(duì)象
如果有處理過(guò)上面這些工作的朋友們,應(yīng)該不難理解了吧。
有了dynamic的支持讓我們看下更強(qiáng)大的功能吧:
反射調(diào)用
Type type = Type.GetType("ConsoleApplication1.Test");
dynamic t = Activator.CreateInstance(type);
t.Print("你好,szl,歡迎使用 CSharp 4.0!");
這里我們之間調(diào)用了ConsoleApplication1.Test類(lèi)型中的Print方法,就行創(chuàng)建實(shí)例后調(diào)用一樣,是不是很方便。
P/Invoke 調(diào)用
dynamic user32 = new DynamicDllImport("user32.dll",
callingConvention: CallingConvention.Winapi);
user32.MessageBox(0, "Hello World", "Platform Invoke Sample", 0);
DynamicDllImport是Mono發(fā)布的一個(gè)類(lèi),利用它我們可以直接調(diào)用WinAPI,這里調(diào)用了MessageBox函數(shù)。詳細(xì)內(nèi)容我會(huì)在下一篇文章《.NET4.0新特性之互操作》進(jìn)行介紹。
動(dòng)態(tài)語(yǔ)言運(yùn)行
動(dòng)態(tài)語(yǔ)言運(yùn)行時(shí) (DLR) 是一種運(yùn)行時(shí)環(huán)境,它將一組適用于動(dòng)態(tài)語(yǔ)言的服務(wù)添加到公共語(yǔ)言運(yùn)行時(shí) (CLR)。借助于 DLR,可以更輕松地開(kāi)發(fā)要在 .NET Framework 上運(yùn)行的動(dòng)態(tài)語(yǔ)言,而且向靜態(tài)類(lèi)型化語(yǔ)言添加動(dòng)態(tài)功能也會(huì)更容易。
動(dòng)態(tài)語(yǔ)言可以在運(yùn)行時(shí)標(biāo)識(shí)對(duì)象的類(lèi)型,而在類(lèi)似 C# 和 Visual Basic 的靜態(tài)類(lèi)型化語(yǔ)言中(當(dāng)您使用 Option Explicit On 時(shí)),您必須在設(shè)計(jì)時(shí)指定對(duì)象類(lèi)型。動(dòng)態(tài)語(yǔ)言的示例有:Lisp、Smalltalk、JavaScript、PHP、Ruby、Python、ColdFusion、Lua、Cobra 和 Groovy。
大多數(shù)動(dòng)態(tài)語(yǔ)言都會(huì)向開(kāi)發(fā)人員提供以下優(yōu)點(diǎn):
可以使用快速反饋循環(huán)(REPL 或讀取-計(jì)算-打印循環(huán))。這樣,您就可以在輸入幾條語(yǔ)句之后立即執(zhí)行它們以查看結(jié)果。
同時(shí)支持自上而下的開(kāi)發(fā)和更傳統(tǒng)的自下而上的開(kāi)發(fā)。例如,當(dāng)您使用自上而下的方法時(shí),可以調(diào)用尚未實(shí)現(xiàn)的函數(shù),然后在需要時(shí)添加基礎(chǔ)實(shí)現(xiàn)。
更易于進(jìn)行重構(gòu)和代碼修改操作,原因是您不必在代碼中四處更改靜態(tài)類(lèi)型聲明。
利用動(dòng)態(tài)語(yǔ)言可以生成優(yōu)秀的腳本語(yǔ)言。利用新的命令和功能,客戶(hù)可以輕松地?cái)U(kuò)展使用動(dòng)態(tài)語(yǔ)言創(chuàng)建的應(yīng)用程序。動(dòng)態(tài)語(yǔ)言還經(jīng)常用于創(chuàng)建網(wǎng)站和測(cè)試工具、維護(hù)服務(wù)器場(chǎng)、開(kāi)發(fā)各種實(shí)用工具以及執(zhí)行數(shù)據(jù)轉(zhuǎn)換。
DLR 的目的是允許動(dòng)態(tài)語(yǔ)言系統(tǒng)在 .NET Framework 上運(yùn)行,并為動(dòng)態(tài)語(yǔ)言提供 .NET 互操作性。在 Visual Studio 2010 中,DLR 將動(dòng)態(tài)對(duì)象引入到 C# 和 Visual Basic 中,以便這些語(yǔ)言能夠支持動(dòng)態(tài)行為,并且可以與動(dòng)態(tài)語(yǔ)言進(jìn)行互操作。
DLR 還可幫助您創(chuàng)建支持動(dòng)態(tài)操作的庫(kù)。例如,如果您具有一個(gè)使用 XML 或 JavaScript 對(duì)象表示法 (JSON) 對(duì)象的庫(kù),則對(duì)于使用 DLR 的語(yǔ)言,您的對(duì)象可以顯示為動(dòng)態(tài)對(duì)象。這使庫(kù)用戶(hù)能夠編寫(xiě)語(yǔ)法更簡(jiǎn)單且更自然的代碼,以便操作對(duì)象和訪(fǎng)問(wèn)對(duì)象成員。