.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 接口啊,可就是能編譯並運行經過: |