理解C# 4 dynamic(4) – 让人惊艳的Clay
一,多種方式初始化對(duì)象
1, 最簡(jiǎn)單的對(duì)象構(gòu)建和初始化
dynamic New = new ClayFactory();var person = New.Person(); person.FirstName = "Louis"; person.LastName = "Dejardin";注意這里的Person并不是一個(gè)具體的,實(shí)際存在的類或者結(jié)構(gòu)體。我們?cè)诓恍枰xPerson類的情況下,就構(gòu)建了一個(gè)具有FirstName和LastName屬性的對(duì)象。
2, 使用索引器的方式初始化
var person = New.Person(); person["FirstName"] = "Louis"; person["LastName"] = "Dejardin";3, 使用匿名對(duì)象的方式實(shí)現(xiàn)初始化
var person = New.Person(new {FirstName = "Louis",LastName = "Dejardin"});4,使用命名參數(shù)方式實(shí)現(xiàn)初始化
var person = New.Person(FirstName: "Louis",LastName: "Dejardin");5,鏈?zhǔn)椒绞匠跏蓟?/strong>
var person = New.Person().FirstName("Louis").LastName("Dejardin");讀取屬性方式
person.FirstName person[“FirstName”] person.FirstName()上面三種都是訪問FirstName屬性,它們都是等價(jià)的。
多種多樣的初始化對(duì)象和讀取屬性的方式,讓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. 可以通過(guò)索引訪問
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. 簡(jiǎn)單方便地為對(duì)象添加Array屬性
person.Aliases("bleroy", "BoudinFatal");這里是為person這個(gè)動(dòng)態(tài)對(duì)象添加了一個(gè)Array屬性,屬性的名字叫Aliases, 所以這里Aliases可以替換成任何名稱,并沒有特定含義。
下面的代碼和上面的作用是等價(jià)的:
5. Array中的元素類型是dynamic,而不是普通類型
因?yàn)?span style="color: #ff6600;">Array元素的類型是dynamic, 所以可以有這樣的Array:
var people = New.Array(New.Person().FirstName("Louis").LastName("Dejardin"), "Peter");三, 為對(duì)象動(dòng)態(tài)添加方法
和ExpandoObject一樣,你也可以為其擴(kuò)展方法,只是方法調(diào)用的時(shí)候,需要多添加一個(gè)().
這可能是Clay支持用()來(lái)訪問對(duì)象屬性導(dǎo)致的。
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!"));
四,動(dòng)態(tài)的實(shí)現(xiàn)接口
假設(shè)我們定義了這個(gè)接口,用動(dòng)態(tài)類型創(chuàng)建一個(gè)對(duì)象,而且這個(gè)對(duì)象是實(shí)現(xiàn)了該接口,這看起來(lái)是不是不可完成的任務(wù)? 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的應(yīng)用背景
Clay產(chǎn)生于Orchard CMS項(xiàng)目,Orchard CMS是基于Asp.net MVC的開源CMS。對(duì)于CMS頁(yè)面呈現(xiàn)所要使用的ViewModel來(lái)說(shuō),是無(wú)法預(yù)測(cè)和事先定義的,沒有任何規(guī)則可言,因?yàn)槟銢]有辦法知道,我用到的頁(yè)面會(huì)增加什么數(shù)據(jù)的顯示。Orchard中想通過(guò)一種構(gòu)建一個(gè)可以自由擴(kuò)展的,靈活的dynamic對(duì)象來(lái)一勞永逸的解決這個(gè)問題,這就是Clay的初衷。
Clay是一個(gè)獨(dú)立的開源項(xiàng)目,它無(wú)所不能的能力,一定能夠幫助你簡(jiǎn)化很多類定義和反射代碼。
六,Clay的Sample
Clay的示例代碼可以通過(guò)nuget很方便的取到,給位可以自己建個(gè)Console程序,下載下來(lái)看看。
相關(guān)文章:
理解C# 4 dynamic(1) - var, object, dynamic的區(qū)別以及dynamic的使用
理解C# 4 dynamic(2) – ExpandoObject的使用
理解C# 4 dynamic(3) – DynamicObject的使用
原文地址:http://www.cnblogs.com/JustRun1983/p/3529157.html
.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺(tái)或掃描二維碼關(guān)注
總結(jié)
以上是生活随笔為你收集整理的理解C# 4 dynamic(4) – 让人惊艳的Clay的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 拆分:分解单块系统——《微服务设计》读书
- 下一篇: 发力企业级市场,微软Hololens开辟