不过借助 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目前没有发布好的下载但我们可以直接下载它的源码