天天看點

dynamic 動态類型 教你寫不可思議的C#代碼

  • 雖然.NET4中已經引入了dynamic的動态類型,但是它相對于其他的來說還是不盡人意,不過下面要介紹的一個開源項目會讓您能夠寫出不可思議的C#代碼。
  •    .Net 4 中引入了 dynamic 動态類型,這一消息确實讓我們興奮了一把,但是興奮之餘,又發現它相對于其他的動态語言來說還有不足之處。不過借助 CodePlex 上的一個開源項目 Clay,我們可以寫出以下不可思議的代碼,代碼如下:
    1. var directory = New.Array(  
    2.     New.Person(  
    3.         FirstName: "Louis",  
    4.         LastName: "Dejardin",  
    5.         Aliases: new[] { "Lou" }  
    6.     ),  
    7.     New.Person(  
    8.         FirstName: "Bertrand",  
    9.         LastName: "Le Roy" 
    10.     ).Aliases("bleroy", "boudin"),  
    11.     New.Person(  
    12.         FirstName: "Renaud",  
    13.         LastName: "Paquay" 
    14.     ).Aliases("Your Scruminess", "Chef")  
    15. ).Name("Some Orchard folks"); 

    讓我們先來看看是代碼是如何的不可思議。

    不可思議的對象初始化

    建立 c# 項目,引用 Clay 項目(或其 dll), 并加入下面一行代碼(建議看完本文再自行嘗試):

    1. dynamic New = new ClayFactory(); 
    先看下面的簡單代碼:
    1. var person = New.Person();  
    2. person.FirstName = "Louis"
    3. ;person.LastName = "Dejardin"; 

    不足為奇,使用 .Net 4 中的 ExpandoObject 也能做到。

    下面的代碼就有點意思了:

    1. var person = New.Person();  
    2. person["FirstName"] = "Louis";  
    3. person["LastName"] = "Dejardin"; 

    這段代碼和上面的效果是一樣的,它使用索引器的方式為 person 的屬性指派,是不是有點類似 JavaScript?

    再來看 jQuery 風格的代碼:

    1. var person = New.Person()  
    2.     .FirstName("Louis")  
    3.     .LastName("Dejardin"); 
    還可以使用匿名類型方式:
    1. var person = New.Person(new {  
    2.     FirstName = "Louis",  
    3.     LastName = "Dejardin" 
    4. }); 
    甚至還可以使用命名參數方式:
    1. var person = New.Person(  
    2.     FirstName: "Louis",  
    3.     LastName: "Dejardin" 
    4. ); 

    不可思議吧!

    綜上所述,我們有多種方式始化實體設定屬性值,以下方式都是等同的:

    1. person.FirstName  
    2. person["FirstName"]  
    3. person.FirstName() 

    不可思議的 Array

    我們可以建立 JavaScript 風格的 Array:

    1. var people = New.Array(  
    2.     New.Person().FirstName("Louis").LastName("Dejardin"),  
    3.     New.Person().FirstName("Bertrand").LastName("Le Roy")  
    4. ); 
    可如下操作這個集合:
    1. int count = people.Count;  
    2. string firstName = people[0].FirstName; 
    我們還可以給執行個體動态增加 array 屬性:
    1. person.Aliases("bleroy", "BoudinFatal"); 
    或者:
    1. person.Aliases(new[] {"Lou"}); 
    還能向集合中增加新的元素:
    1. person.Aliases.Add("loudej"); 

    到這裡,寫出文首給出的 c# 代碼應該不成問題了。

    不可思議的動态接口實作

    “動态接口實作”這個标題可能不太恰當,還是通過代碼來說明問題吧。假定我們有如下接口:

    1. public interface IPerson {  
    2.     string FirstName { get; set; }  
    3.     string LastName { get; set; }  
    可以如下使用:
    1. dynamic New = new ClayFactory();  
    2. var people = New.Array(  
    3.     New.Person().FirstName("Louis").LastName("Dejardin"),  
    4.     New.Person().FirstName("Bertrand").LastName("Le Roy")  
    5. );  
    6. IPerson lou = people[0];  
    7. var fullName = lou.FirstName + " " + lou.LastName; 
    隻不過是我們通過 New.Person() 建立的一個動态對象,并沒有實作 IPerson 接口啊,可就是能編譯并運作通過:
    dynamic 動态類型 教你寫不可思議的C#代碼
    神奇吧!還不抓緊試試!