.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 接口啊,可就是能编译并运行经过: |