教你寫不可思議的C#代碼
.Net 4 中引入了 dynamic 動(dòng)態(tài)類型,這一消息確實(shí)讓我們興奮了一把,但是興奮之余,又發(fā)現(xiàn)它相對(duì)于其他的動(dòng)態(tài)語言來說還有不足之處。不過借助 CodePlex 上的一個(gè)開源項(xiàng)目 Clay,我們可以寫出以下不可思議的代碼,代碼如下:
- var directory = New.Array(
- New.Person(
- FirstName: "Louis",
- LastName: "Dejardin",
- Aliases: new[] { "Lou" }
- ),
- New.Person(
- FirstName: "Bertrand",
- LastName: "Le Roy"
- ).Aliases("bleroy", "boudin"),
- New.Person(
- FirstName: "Renaud",
- LastName: "Paquay"
- ).Aliases("Your Scruminess", "Chef")
- ).Name("Some Orchard folks");
讓我們先來看看是代碼是如何的不可思議。
不可思議的對(duì)象初始化
新建 c# 項(xiàng)目,引用 Clay 項(xiàng)目(或其 dll), 并加入下面一行代碼(建議看完本文再自行嘗試):
- dynamic New = new ClayFactory();
先看下面的簡單代碼:
- var person = New.Person();
- person.FirstName = "Louis"
- ;person.LastName = "Dejardin";
不足為奇,使用 .Net 4 中的 ExpandoObject 也能做到。
下面的代碼就有點(diǎn)意思了:
- var person = New.Person();
- person["FirstName"] = "Louis";
- person["LastName"] = "Dejardin";
這段代碼和上面的效果是一樣的,它使用索引器的方式為 person 的屬性賦值,是不是有點(diǎn)類似 JavaScript?
再來看 jQuery 風(fēng)格的代碼:
- var person = New.Person()
- .FirstName("Louis")
- .LastName("Dejardin");
還可以使用匿名類型方式:
- var person = New.Person(new {
- FirstName = "Louis",
- LastName = "Dejardin"
- });
甚至還可以使用命名參數(shù)方式:
- var person = New.Person(
- FirstName: "Louis",
- LastName: "Dejardin"
- );
不可思議吧!
綜上所述,我們有多種方式始化實(shí)體設(shè)置屬性值,以下方式都是等同的:
- person.FirstName
- person["FirstName"]
- person.FirstName()
不可思議的 Array
我們可以創(chuàng)建 JavaScript 風(fēng)格的 Array:
- var people = New.Array(
- New.Person().FirstName("Louis").LastName("Dejardin"),
- New.Person().FirstName("Bertrand").LastName("Le Roy")
- );
可如下操作這個(gè)集合:
- int count = people.Count;
- string firstName = people[0].FirstName;
我們還可以給實(shí)例動(dòng)態(tài)增加 array 屬性:
- person.Aliases("bleroy", "BoudinFatal");
或者:
- person.Aliases(new[] {"Lou"});
還能向集合中增加新的元素:
- person.Aliases.Add("loudej");
到這里,寫出文首給出的 c# 代碼應(yīng)該不成問題了。
不可思議的動(dòng)態(tài)接口實(shí)現(xiàn)
“動(dòng)態(tài)接口實(shí)現(xiàn)”這個(gè)標(biāo)題可能不太恰當(dāng),還是通過代碼來說明問題吧。假定我們有如下接口:
- 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;
只不過是我們通過 New.Person() 創(chuàng)建的一個(gè)動(dòng)態(tài)對(duì)象,并沒有實(shí)現(xiàn) IPerson 接口啊,可就是能編譯并運(yùn)行通過:

神奇吧!還不抓緊試試!
Clay 是 CodePlex 上的一個(gè)開源項(xiàng)目,幫助我們創(chuàng)建輕松創(chuàng)建對(duì)象,就 JavaScript 或其它動(dòng)態(tài)語言一樣簡單。Clay 項(xiàng)目的網(wǎng)址是 http://clay.codeplex.com,目前沒有發(fā)布好的下載,我們可以直接下載它的源碼
【編輯推薦】
- Lambda簡化C#編程學(xué)習(xí)心得
- C#圖片處理的3種高級(jí)實(shí)用方法
- C#不如Java的地方:靜態(tài)導(dǎo)入
- 10個(gè)C#編程和Visual Studio使用技巧























