.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 =newClayFactory(); |
先看下面的简单代码:
var person = New.Person(); person.FirstName = "Louis"; |
不足为奇,使用 .Net 4 中的 ExpandoObject 也能做到。
下面的代码就有点意思了:
var person = New.Person(); |
这段代码和上面的效果是一样的,它使用索引器的方式为 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() |