理解C# 4 dynamic(4) – 让人惊艳的Clay(转)
作者:Justrun名字来自《阿甘正传》,是希望自己能够更更傻一点。
link: http://www.cnblogs.com/JustRun1983/p/3529157.html
理解C# 4 dynamic(4) – 让人惊艳的Clay(转)
2014-01-22 07:27 by JustRun, 8360 阅读, 38 评论, 收藏, 编辑
dynamic New = new ClayFactory();
注意这里的Person并不是一个具体的,实际存在的类或者结构体。我们在不需要定义Person类的情况下,就构建了一个具有FirstName和LastName属性的对象。
person["FirstName"] = "Louis";
person["LastName"] = "Dejardin";
上面三种都是访问FirstName属性,它们都是等价的。
多种多样的初始化对象和读取属性的方式,让dynamic变得更加灵活. 这些都是ExpandoObject所做不到的。
dynamic New = new ClayFactory();
New.Person().FirstName("Louis").LastName("Dejardin"),
New.Person().FirstName("Bertrand").LastName("Le Roy")
Console.WriteLine("Count = {0}", people.Count);
Console.WriteLine("people[0].FirstName = {0}", people[0].FirstName);
foreach (var person in people) {
Console.WriteLine("{0} {1}", person.FirstName, person.LastName);
person.Aliases("bleroy", "BoudinFatal");
这里是为person这个动态对象添加了一个Array属性,属性的名字叫Aliases, 所以这里Aliases可以替换成任何名称,并没有特定含义。
下面的代码和上面的作用是等价的:
persons.Aliases1(new[] {"bleroy", "BoudinFatal"});
5. Array中的元素类型是dynamic,而不是普通类型
因为Array元素的类型是dynamic, 所以可以有这样的Array:
New.Person().FirstName("Louis").LastName("Dejardin"),
和ExpandoObject一样,你也可以为其扩展方法,只是方法调用的时候,需要多添加一个().
这可能是Clay支持用()来访问对象属性导致的。
person.SayFullName = new Func<string, string>(x => person.FirstName + person.LastName + x);
Console.WriteLine(person.SayFullName()(" Here!"));
假设我们定义了这个接口,用动态类型创建一个对象,而且这个对象是实现了该接口,这看起来是不是不可完成的任务? Clay能办到!
string FirstName { get; set; }
dynamic New = new ClayFactory();
New.Person().FirstName("Louis").LastName("Dejardin"),
New.Person().FirstName("Bertrand").LastName("Le Roy"));
var fullName = lou.FirstName + " " + lou.LastName;
Clay是一个独立的开源项目,它无所不能的能力,一定能够帮助你简化很多类定义和反射代码。
Clay的示例代码可以通过nuget很方便的取到,给位可以自己建个Console程序,下载下来看看。
理解C# 4 dynamic(1) - var, object, dynamic的区别以及dynamic的使用
理解C# 4 dynamic(2) – ExpandoObject的使用
理解C# 4 dynamic(3) – DynamicObject的使用
理解C# 4 dynamic(4) – 让人惊艳的Clay