?!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
Clay非常cM于ExpandoObject, 可以看做是ExpandoObject的加强版. 它们能够让我们在不需要定义类的情况下Q就构徏出我们想要的对象。Clay和ExpandoObject相比Q提供了更加灉|的语法支持,让我们像写javascript代码一样写C#代码Q同时还能够用于构徏多层U的复杂对象?/p>
阅读目录:
一、多U方式初始化对象
二、构建神奇的Array
三、ؓ对象动态添加方?/p>
四、动态的实现接口
五、Clay的应用背?/p>
六、Clay的Sample
一Q多U方式初始化对象
1, 最单的对象构徏和初始化
dynamic New = new ClayFactory();
var person = New.Person();
person.FirstName = "Louis";
person.LastName = "Dejardin";
注意q里的Personq不是一个具体的Q实际存在的cL者结构体。我们在不需要定义Personcȝ情况下,构Z一个具有FirstName和LastName属性的对象?/p>
2, 使用索引器的方式初始?/p>
var person = New.Person();
person["FirstName"] = "Louis";
person["LastName"] = "Dejardin";
3, 使用匿名对象的方式实现初始化
var person = New.Person(new {
FirstName = "Louis",
LastName = "Dejardin"
});
4Q用命名参数方式实现初始化
var person = New.Person(
FirstName: "Louis",
LastName: "Dejardin"
);
5Q链式方式初始化
var person = New.Person()
.FirstName("Louis")
.LastName("Dejardin");
d属性方?/p>
person.FirstName
person[“FirstName”]
person.FirstName()
上面三种都是讉KFirstName属性,它们都是{h的?/p>
多种多样的初始化对象和读取属性的方式Q让dynamic变得更加灉|. q些都是ExpandoObject所做不到的?/p>
二,构徏奇的Array
我们可以创徏 JavaScript 风格?Array:
dynamic New = new ClayFactory();
var people = New.Array(
New.Person().FirstName("Louis").LastName("Dejardin"),
New.Person().FirstName("Bertrand").LastName("Le Roy")
);
1. 构徏的Array, hCount属?/p>
Console.WriteLine("Count = {0}", people.Count);
2. 可以通过索引讉K
Console.WriteLine("people[0].FirstName = {0}", people[0].FirstName);
3. 支持foreach遍历
foreach (var person in people) {
Console.WriteLine("{0} {1}", person.FirstName, person.LastName);
}
4. 单方便地为对象添加Array属?/p>
person.Aliases("bleroy", "BoudinFatal");
q里是ؓpersonq个动态对象添加了一个Array属性,属性的名字叫Aliases, 所以这里Aliases可以替换成Q何名Uͼq没有特定含义?/p>
下面的代码和上面的作用是{h?
persons.Aliases1(new[] {"bleroy", "BoudinFatal"});
5. Array中的元素cd是dynamicQ而不是普通类?/p>
因ؓArray元素的类型是dynamic, 所以可以有q样的Array:
var people = New.Array(
New.Person().FirstName("Louis").LastName("Dejardin"),
"Peter"
);
? 为对象动态添加方?/strong>
和ExpandoObject一P你也可以为其扩展ҎQ只是方法调用的时候,需要多d一?).
q可能是Clay支持?)来访问对象属性导致的?/p>
复制代码
var person = New.Pserson();
person.FirstName = "Louis";
person.LastName = "Dejardin";
person.SayFullName = new Func<string, string>(x => person.FirstName + person.LastName + x);
Console.WriteLine(person.SayFullName()(" Here!"));
复制代码
四,动态的实现接口
假设我们定义了这个接口,用动态类型创Z个对象,而且q个对象是实C该接口,q看h是不是不可完成的d? Clay能办?
复制代码
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;
复制代码
五,Clay的应用背?/strong>
Clay产生于Orchard CMS目QOrchard CMS是基于Asp.net MVC的开源CMS。对于CMS面呈现所要用的ViewModel来说Q是无法预测和事先定义的Q没有Q何规则可aQ因Z没有办法知道Q我用到的页面会增加什么数据的昄。Orchard中想通过一U构Z个可以自由扩展的Q灵zȝdynamic对象来一x逸的解决q个问题Q这是Clay的初街?/p>
Clay是一个独立的开源项目,它无所不能的能力,一定能够帮助你化很多类定义和反代码?/p>