程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 理解C# 4 dynamic(4) – 讓人驚艷的Clay

理解C# 4 dynamic(4) – 讓人驚艷的Clay

編輯:C#入門知識

Clay非常類似於ExpandoObject, 可以看做是ExpandoObject的加強版. 它們能夠讓我們在不需要定義類的情況下,就構建出我們想要的對象。Clay和ExpandoObject相比,提供了更加靈活的語法支持,讓我們像寫javascript代碼一樣寫C#代碼,同時還能夠用於構建多層級的復雜對象。   閱讀目錄:   一、多種方式初始化對象   二、構建神奇的Array   三、為對象動態添加方法   四、動態的實現接口   五、Clay的應用背景   六、Clay的Sample   一,多種方式初始化對象   1, 最簡單的對象構建和初始化   dynamic New = new ClayFactory(); var person = New.Person(); person.FirstName = "Louis"; person.LastName = "Dejardin"; 注意這裡的Person並不是一個具體的,實際存在的類或者結構體。我們在不需要定義Person類的情況下,就構建了一個具有FirstName和LastName屬性的對象。   2, 使用索引器的方式初始化   var person = New.Person(); person["FirstName"] = "Louis"; person["LastName"] = "Dejardin"; 3, 使用匿名對象的方式實現初始化   var person = New.Person(new {     FirstName = "Louis",     LastName = "Dejardin" }); 4,使用命名參數方式實現初始化   var person = New.Person(     FirstName: "Louis",     LastName: "Dejardin" ); 5,鏈式方式初始化   var person = New.Person()                .FirstName("Louis")                .LastName("Dejardin"); 讀取屬性方式   person.FirstName person[“FirstName”] person.FirstName() 上面三種都是訪問FirstName屬性,它們都是等價的。 多種多樣的初始化對象和讀取屬性的方式,讓dynamic變得更加靈活. 這些都是ExpandoObject所做不到的。   二,構建神奇的Array   我們可以創建 JavaScript 風格的 Array:   dynamic New = new ClayFactory();           var people = New.Array(               New.Person().FirstName("Louis").LastName("Dejardin"),               New.Person().FirstName("Bertrand").LastName("Le Roy")           );  1. 構建的Array, 具有Count屬性   Console.WriteLine("Count = {0}", people.Count); 2. 可以通過索引訪問   Console.WriteLine("people[0].FirstName = {0}", people[0].FirstName);  3. 支持foreach遍歷   foreach (var person in people) {      Console.WriteLine("{0} {1}", person.FirstName, person.LastName); } 4. 簡單方便地為對象添加Array屬性   person.Aliases("bleroy", "BoudinFatal"); 這裡是為person這個動態對象添加了一個Array屬性,屬性的名字叫Aliases, 所以這裡Aliases可以替換成任何名稱,並沒有特定含義。 下面的代碼和上面的作用是等價的:   persons.Aliases1(new[] {"bleroy", "BoudinFatal"}); 5. Array中的元素類型是dynamic,而不是普通類型   因為Array元素的類型是dynamic, 所以可以有這樣的Array:   var people = New.Array(      New.Person().FirstName("Louis").LastName("Dejardin"),      "Peter" ); 三, 為對象動態添加方法   和ExpandoObject一樣,你也可以為其擴展方法,只是方法調用的時候,需要多添加一個(). 這可能是Clay支持用()來訪問對象屬性導致的。   復制代碼 var person = New.Pserson();           person.FirstName = "Louis";           person.LastName = "Dejardin";           person.SayFullName = new Func<string, string>(x => person.FirstName + person.LastName + x);             Console.WriteLine(person.SayFullName()(" Here!")); 復制代碼 四,動態的實現接口   假設我們定義了這個接口,用動態類型創建一個對象,而且這個對象是實現了該接口,這看起來是不是不可完成的任務? Clay能辦到!   復制代碼 public interface IPerson {         string FirstName { get; set; }         string LastName { get; set; } }   dynamic New = new ClayFactory(); var people = New.Array( New.Person().FirstName("Louis").LastName("Dejardin"), New.Person().FirstName("Bertrand").LastName("Le Roy")); IPerson lou = people[0]; var fullName = lou.FirstName + " " + lou.LastName; 復制代碼 五,Clay的應用背景   Clay產生於Orchard CMS項目,Orchard CMS是基於Asp.net MVC的開源CMS。對於CMS頁面呈現所要使用的ViewModel來說,是無法預測和事先定義的,沒有任何規則可言,因為你沒有辦法知道,我用到的頁面會增加什麼數據的顯示。Orchard中想通過一種構建一個可以自由擴展的,靈活的dynamic對象來一勞永逸的解決這個問題,這就是Clay的初衷。   Clay是一個獨立的開源項目,它無所不能的能力,一定能夠幫助你簡化很多類定義和反射代碼。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved