像javascript 同樣寫c# 。

摘要: .Net 4 中引入了 dynamic 動態類型,着實讓咱們興奮的一把,不過相對其它動態語言, 仍是有很多差距的。不過藉助 CodePlex 上的一個開源項目 Clay,咱們能夠寫出如下難以想象的代碼:var directory = New.Array( New. ...
.Net 4 中引入了 dynamic 動態類型,着實讓咱們興奮的一把,不過相對其它動態語言, 仍是有很多差距的。
不過藉助 CodePlex 上的一個開源項目 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");Clay 項目將在本文後面提到,咱們先來看看是代碼是如何的難以想象。
難以想象的對象初始化
新建 c# 項目,引用 Clay 項目(或其 dll), 並加入下面一行代碼(建議看完本文再自行嘗試):
dynamic New = new ClayFactory();先看下面的簡單代碼:
var person = New.Person();
person.FirstName = "Louis";person.LastName = "Dejardin";不足爲奇,使用 .Net 4 中的 ExpandoObject 也能作到。
下面的代碼就有點意思了:
var person = New.Person();person["FirstName"] = "Louis";person["LastName"] = "Dejardin";這段代碼和上面的效果是同樣的,它使用索引器的方式爲 person 的屬性賦值,是否是有點相似 JavaScript?
再來看 jQuery 風格的代碼:
var person = New.Person()
    .FirstName("Louis")
    .LastName("Dejardin");還可使用匿名類型方式:
var person = New.Person(new {
    FirstName = "Louis",
    LastName = "Dejardin"
});甚至還可使用命名參數方式:
var person = New.Person(
    FirstName: "Louis",
    LastName: "Dejardin"
);難以想象吧!
綜上所述,咱們有多種方式始化實體設置屬性值,如下方式都是等同的:
person.FirstName
person["FirstName"]
person.FirstName()難以想象的 Array
咱們能夠建立 JavaScript 風格的 Array:
var people = New.Array(
    New.Person().FirstName("Louis").LastName("Dejardin"),
    New.Person().FirstName("Bertrand").LastName("Le Roy")
);可以下操做這個集合:
int count = people.Count;
string firstName = people[0].FirstName;咱們還能夠給實例動態增長 array 屬性:
person.Aliases("bleroy", "BoudinFatal");或者:
person.Aliases(new[] {"Lou"});還能向集合中增長新的元素:
person.Aliases.Add("loudej");到這裏,寫出文首給出的 c# 代碼應該不成問題了。
難以想象的動態接口實現
「動態接口實現」這個標題可能不太恰當,仍是經過代碼來講明問題吧。假定咱們有以下接口:
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;people[0] 只不過是咱們經過 New.Person() 建立的一個動態對象,並無實現 IPerson 接口啊,可就是能編譯並運行經過:


神奇吧!還不抓緊試試!
Clay 項目
Clay 是 CodePlex 上的一個開源項目,幫助咱們建立輕鬆建立對象,就 JavaScript 或其它動態語言同樣簡單。
Clay 項目的網址是 http://clay.codeplex.com,目前沒有發佈好的下載,但咱們能夠直接下載它的源碼: c#


Clay 目前主要應用於 Orchard 項目,請參見如下文章:
Clay: malleable C# dynamic objects – part 1: why we need it 
Clay: malleable C# dynamic objects – part 2
本文改編自第二篇文章。
詳細我就很少說了,留給你們討論吧。 ui

相關文章
相關標籤/搜索