西西軟件園多重安全檢測下載網(wǎng)站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁編程開發(fā)C#.NET → .Net 4.0 Dynamic 動態(tài)類型 ExpandoObject類和DuckType 的支持

.Net 4.0 Dynamic 動態(tài)類型 ExpandoObject類和DuckType 的支持

相關(guān)軟件相關(guān)文章發(fā)表評論 來源:本站整理時間:2010/12/9 8:34:38字體大小:A-A+

作者:佚名點擊:316次評論:0次標(biāo)簽: .Net Dynamic DuckType

  • 類型:系統(tǒng)其它大小:2.2M語言:中文 評分:10.0
  • 標(biāo)簽:
立即下載
   本文主要旨在與網(wǎng)友分享.Net4.0的Dynamic 對Duck Type 的支持。

     一、.net4.0主要新特性


        .Net4.0在.Net3.5基礎(chǔ)上新增的主要特性有:可選參數(shù)、命名參數(shù)和Dynamic。具體請閱生魚片的這篇博文。這里我們著重講解C#4.0的Dynamic特性,對于其他特性大家可以在VS2010內(nèi)嘗試一下?傊.Net在不斷進(jìn)步中。

      二、ExpandoObject普通應(yīng)用  


       ExpandoObject 類,“需引用System.Dynamic命名空間” 。請看以下代碼:       

1dynamic Customer = new ExpandoObject();
2Customer.Name = "Lucy";
3Customer.Age = 20;
4Customer.Female = true;
5Console.WriteLine(Customer.Name + Customer.Age + Customer.Female);
6Console.ReadKey();
  
輸出<< Lucy20True,這里已經(jīng)類似javascript 的var obj ={}; obj.Name ='lucy'。但又不完全相同,因為不能在clr運行時動態(tài)生成屬性或者方法。但至少比.NET3.5先進(jìn)了。

    三、Dynamic 動態(tài)類型對DuckType 的支持


      1.前不久看見了thinking的這篇博文,文中有這么一段代碼:

static class Calculator {
public static T Add<T>(T t1, T t2) {
dynamic d1 = t1;
dynamic d2 = t2;

return (T)(d1 + d2);
}
}

public static void Main(string[] args){
int i = Calculator.Add(1, 2);
double d = Calculator.Add(1.1, 2.2);
string s = Calculator.Add("abc", "def");

Console.WriteLine(i + " " + d + " " + s);

}

輸出:

>>3 3.3 abcdef

作者在文中指出了以上C#代碼是為了通過動態(tài)類型來實現(xiàn)基于duck typing的泛型參數(shù)約束。

為了在C#支持Duck Type還有一個重要的.Net4.0特性有必要提及到,這也是本文重點討論的內(nèi)容。

它就是:“DynamicObject” 該類位于System.Dynamic 命名空間下。在VS2010內(nèi)就可以看見該類的成員列表,截圖如下:

所屬方法都是虛方法,我們可以重寫這些虛方法。這里主要看TryInvokeMember()方法。這個方法VS2010給出了詳細(xì)的描述。

根據(jù)VS2010注釋,由于我的VS2010是英文版的,這里就不貼出英文注釋了。簡單介紹一下如何使用這個方法:假設(shè)我們一個類OurClass它繼承了DynamicObject 這個Class。OurClass中有一個方法OurMethod()。接著在OurClass 類中 重寫 TryInvokeMember這個基類虛方法。以上設(shè)置完后以后只要OurClass 的OurMethod方法一旦被調(diào)用都先執(zhí)行一下重寫后的

   TryInvokeMember()方法。也許您會問這樣到底有何用途?OK!請先看javascript這段代碼片段:

1 function tryInvokeMember(obj) {
2 if (obj && typeof obj.ourMethod === "function") {
3 return obj.ourMethod();
4 }
5 alert('未找到!');
6 return null;
7 }
8
9 var ourObj1 = {};
10 ourObj1.Method = function () {
11 alert('111');
12 };
13
14 var ourObj2 = {};
15 ourObj2.ourMethod = function () {
16 alert('已經(jīng)找到ourMethod并且執(zhí)行');
17 };
18
19 tryInvokeMember(ourObj1);
20 tryInvokeMember(ourObj2);大家讀完這段js代碼后應(yīng)該會明白為什么我要重點討論C#4.0中的DynamicObject了吧?真正的目的就是:在DuckType 類(鴨子) 方法(鴨子叫)執(zhí)行之前,我們要判斷對象的類是否是具備鴨子叫的功能?如果不具備就不應(yīng)該執(zhí)行,否則程序勢必會拋出異常。C#中如何實現(xiàn)呢?步驟如下:

      1、建立DynamicAnimal 類繼承DynamicObject類,并且重寫TryInvokeMember虛方法:

public class DynamicAnimal : DynamicObject
{
public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
{
bool success = base.TryInvokeMember(binder, args, out result);

//如果方法不存在,請將result 這個out參數(shù)賦值為null
if (!success)
result = null;

//如果這個地方返回false 將會引發(fā)異常
return true;
}
}

     2、建立兩個DuckType類,分別為Duck 和 Human:

1 public class Duck : DynamicAnimal
2 {
3 public string Quack()
4 {
5 return "鴨子嘛,就Quack吧!";
6 }
7 }
8  public class Human : DynamicAnimal
9 {
10 public string Talk()
11 {
12 return "人類是用Talk,而不是Quack";
13 }
14 }

    3、在Console 內(nèi) 建立DuckType的調(diào)用方法:

1 public static string DoQuack(dynamic animal)
2 {
3 string result = animal.Quack();
4 return result ?? "...人類當(dāng)然不會鴨叫...";
5 }   4、C onsole 內(nèi) Main方法調(diào)用:

1 static void Main(string[] args)
2 {
3 var duck = new Duck();
4 var cow = new Human();
5 Console.WriteLine("鴨子是Quack");
6 Console.WriteLine(DoQuack(duck));
7 Console.WriteLine("人類是talk");
8 Console.WriteLine(DoQuack(cow));
9 Console.ReadKey();
10 }程序執(zhí)行結(jié)果如下:


您是否對.Net4.0 Dynamic 這個動態(tài)類型有了一個新的認(rèn)識呢?

最后希望本篇文章可以給您帶來幫助,如有不足之處歡迎指出,謝謝!

    相關(guān)評論

    閱讀本文后您有什么感想? 已有人給出評價!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過難過
    • 5 囧
    • 3 圍觀圍觀
    • 2 無聊無聊

    熱門評論

    最新評論

    發(fā)表評論 查看所有評論(0)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評論需要經(jīng)過審核才能顯示)