c#Clay开源的动态语言dynamic框架,让您形如javascript的方式创建对象!
簡介
Clay非常類似于ExpandoObject, 可以看做是ExpandoObject的加強版. 它們能夠讓我們在不需要定義類的情況下,就構建出我們想要的對象。Clay和ExpandoObject相比,提供了更加靈活的語法支持,讓我們像寫javascript代碼一樣寫C#代碼,同時還能夠用于構建多層級的復雜對象。
多種方式初始化對象
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可以替換成任何名稱,并沒有特定含義。
下面的代碼和上面的作用是等價的:
5. Array中的元素類型是dynamic,而不是普通類型
因為Array元素的類型是dynamic, 所以可以有這樣的Array:
var people = New.Array(New.Person().FirstName("Louis").LastName("Dejardin"),"Peter" );為對象動態添加方法和ExpandoObject一樣,你也可以為其擴展方法,只是方法調用的時候,需要多添加一個().
這可能是Clay支持用()來訪問對象屬性導致的。
動態的實現接口
假設我們定義了這個接口,用動態類型創建一個對象,而且這個對象是實現了該接口,這看起來是不是不可完成的任務? 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應用背景
想通過一種構建一個可以自由擴展的,靈活的dynamic對象來一勞永逸的解決問題,這就是Clay的初衷。
Clay是一個獨立的開源項目,它無所不能的能力,一定能夠幫助你簡化很多類定義和反射代碼。
總結
以上是生活随笔為你收集整理的c#Clay开源的动态语言dynamic框架,让您形如javascript的方式创建对象!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET Core使用编译时依赖关
- 下一篇: C#使用Objects Comparer