九九热这里直有精品,1区二区三区在线播放,玖玖爱在线观看资源,国产aⅴ综合网,午夜福利男女,日本亚洲欧美三级,日韩无码黄色导航,内射少妇13区,中文字幕高清网

您身邊的軟件定制專家--9年開發(fā)經(jīng)驗為您護(hù)航

18678812288
0531-88887250

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

文章作者:濟(jì)南軟件開發(fā) 時間:2016年12月20日

Clay非常類似于ExpandoObject, 可以看做是ExpandoObject的加強(qiáng)版. 它們能夠讓我們在不需要定義類的情況下,就構(gòu)建出我們想要的對象。Clay和ExpandoObject相比,提供了更加靈活的語法支持,讓我們像寫javascript代碼一樣寫C#代碼,同時還能夠用于構(gòu)建多層級的復(fù)雜對象。

 

閱讀目錄:

 

一、多種方式初始化對象

 

二、構(gòu)建神奇的Array

 

三、為對象動態(tài)添加方法

 

四、動態(tài)的實現(xiàn)接口

 

五、Clay的應(yīng)用背景

 

六、Clay的Sample

 

一,多種方式初始化對象

 

1, 最簡單的對象構(gòu)建和初始化

 

dynamic New = new ClayFactory();

var person = New.Person();

person.FirstName = "Louis";

person.LastName = "Dejardin";

注意這里的Person并不是一個具體的,實際存在的類或者結(jié)構(gòu)體。我們在不需要定義Person類的情況下,就構(gòu)建了一個具有FirstName和LastName屬性的對象。

 

2, 使用索引器的方式初始化

 

var person = New.Person();

person["FirstName"] = "Louis";

person["LastName"] = "Dejardin";

3, 使用匿名對象的方式實現(xiàn)初始化

 

var person = New.Person(new {

    FirstName = "Louis",

    LastName = "Dejardin"

});

4,使用命名參數(shù)方式實現(xiàn)初始化

 

var person = New.Person(

    FirstName: "Louis",

    LastName: "Dejardin"

);

5,鏈?zhǔn)椒绞匠跏蓟?/p>

 

var person = New.Person()

               .FirstName("Louis")

               .LastName("Dejardin");

讀取屬性方式

 

person.FirstName

person[“FirstName”]

person.FirstName()

上面三種都是訪問FirstName屬性,它們都是等價的。

多種多樣的初始化對象和讀取屬性的方式,讓dynamic變得更加靈活. 這些都是ExpandoObject所做不到的。

 

二,構(gòu)建神奇的Array

 

我們可以創(chuàng)建 JavaScript 風(fēng)格的 Array:

 

dynamic New = new ClayFactory();

          var people = New.Array(

              New.Person().FirstName("Louis").LastName("Dejardin"),

              New.Person().FirstName("Bertrand").LastName("Le Roy")

          ); 

1. 構(gòu)建的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這個動態(tài)對象添加了一個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"

);

三, 為對象動態(tài)添加方法

 

和ExpandoObject一樣,你也可以為其擴(kuò)展方法,只是方法調(diào)用的時候,需要多添加一個().

這可能是Clay支持用()來訪問對象屬性導(dǎo)致的。

 

復(fù)制代碼

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!"));

復(fù)制代碼

四,動態(tài)的實現(xiàn)接口

 

假設(shè)我們定義了這個接口,用動態(tài)類型創(chuàng)建一個對象,而且這個對象是實現(xiàn)了該接口,這看起來是不是不可完成的任務(wù)? Clay能辦到!

 

復(fù)制代碼

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;

復(fù)制代碼

五,Clay的應(yīng)用背景

 

Clay產(chǎn)生于Orchard CMS項目,Orchard CMS是基于Asp.net MVC的開源CMS。對于CMS頁面呈現(xiàn)所要使用的ViewModel來說,是無法預(yù)測和事先定義的,沒有任何規(guī)則可言,因為你沒有辦法知道,我用到的頁面會增加什么數(shù)據(jù)的顯示。Orchard中想通過一種構(gòu)建一個可以自由擴(kuò)展的,靈活的dynamic對象來一勞永逸的解決這個問題,這就是Clay的初衷。

 

Clay是一個獨立的開源項目,它無所不能的能力,一定能夠幫助你簡化很多類定義和反射代碼。


想要了解更多詳情歡迎來電咨詢18678812288
登陸網(wǎng)址:m.h6244.cn。
聯(lián)系人:王經(jīng)理。

达日县| 平泉县| 宁德市| 西城区| 溧阳市| 林口县| 平定县| 蒙山县| 陆河县| 修文县| 祥云县| 河西区| 新营市| 且末县| 东平县| 杭锦后旗| 长葛市| 金山区| 平江县| 阿拉善盟| 和顺县| 宜章县| 淄博市| 泰州市| 溧阳市| 永城市| 南康市| 鄂尔多斯市| 天镇县| 上杭县| 岳普湖县| 西安市| 闽侯县| 龙州县| 罗源县| 迭部县| 专栏| 包头市| 喜德县| 来宾市| 多伦县|