理解C# 4 dynamic(4) – 让人惊艳的Clay
Clay非常类似于ExpandoObject, 可以看做是ExpandoObject的加强版. 它们能够让我们在不需要定义类的情况下,就构建出我们想要的对象。Clay和ExpandoObject相比,提供了更加灵活的语法支持,让我们像写javascript代码一样写C#代码,同时还能够用于构建多层级的复杂对象。
阅读目录:
一、多种方式初始化对象
二、构建神奇的Array
三、为对象动态添加方法
四、动态的实现接口
五、Clay的应用背景
六、Clay的Sample
一,多种方式初始化对象
1, 最简单的对象构建和初始化
dynamic New = new ClayFactory();
var person = New.Person();
person.FirstName = "Louis";
person.LastName = "Dejardin";
注意这里的Person并不是一个具体的,实际存在的类或者结构体。我们在不需要定义Person类的情况下,就构建了一个具有FirstName和LastName属性的对象。
2, 使用索引器的方式初始化
var person = New.Person();
person["FirstName"] = "Louis";
person["LastName"] = "Dejardin";
3, 使用匿名对象的方式实现初始化
var person = New.Person(new {
FirstName = "Louis",
LastName = "Dejardin"
});
4,使用命名参数方式实现初始化
var person = New.Person(
FirstName: "Louis",
LastName: "Dejardin"
);
5,链式方式初始化
var person = New.Person()
.FirstName("Louis")
.LastName("Dejardin");
读取属性方式
person.FirstName
person[“FirstName”]
person.FirstName()
上面三种都是访问FirstName属性,它们都是等价的。
多种多样的初始化对象和读取属性的方式,让dynamic变得更加灵活. 这些都是ExpandoObject所做不到的。
二,构建神奇的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, 具有Count属性
Console.WriteLine("Count = {0}", people.Count);
2. 可以通过索引访问
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属性
person.Aliases("bleroy", "BoudinFatal");
这里是为person这个动态对象添加了一个Array属性,属性的名字叫Aliases, 所以这里Aliases可以替换成任何名称,并没有特定含义。
下面的代码和上面的作用是等价的:
persons.Aliases1(new[] {"bleroy", "BoudinFatal"});
5. Array中的元素类型是dynamic,而不是普通类型
因为Array元素的类型是dynamic, 所以可以有这样的Array:
var people = New.Array(
New.Person().FirstName("Louis").LastName("Dejardin"),
"Peter"
);
三, 为对象动态添加方法
和ExpandoObject一样,你也可以为其扩展方法,只是方法调用的时候,需要多添加一个().
这可能是Clay支持用()来访问对象属性导致的。

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!"));

四,动态的实现接口
假设我们定义了这个接口,用动态类型创建一个对象,而且这个对象是实现了该接口,这看起来是不是不可完成的任务? 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的应用背景
Clay产生于Orchard CMS项目,Orchard CMS是基于Asp.net MVC的开源CMS。对于CMS页面呈现所要使用的ViewModel来说,是无法预测和事先定义的,没有任何规则可言,因为你没有办法知道,我用到的页面会增加什么数据的显示。Orchard中想通过一种构建一个可以自由扩展的,灵活的dynamic对象来一劳永逸的解决这个问题,这就是Clay的初衷。
Clay是一个独立的开源项目,它无所不能的能力,一定能够帮助你简化很多类定义和反射代码。
六,Clay的Sample
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
Reference from : http://www.cnblogs.com/JustRun1983/p/3529157.html
理解C# 4 dynamic(4) – 让人惊艳的Clay的更多相关文章
- 理解C# 4 dynamic(4) – 让人惊艳的Clay(转)
作者:Justrun名字来自<阿甘正传>,是希望自己能够更更傻一点. link: http://www.cnblogs.com/JustRun1983/p/3529157.html 理 ...
- 理解C# 4 dynamic(2) – ExpandoObject的使用
ExpandoObject的使用非常简单,很容易入手.上一篇里面已经有详细的介绍了,可以看这里(理解C# 4 dynamic(1) - var, object, dynamic的区别以及dynamic ...
- 理解C# 4 dynamic(3) – DynamicObject的使用
上篇文章"理解C# 4 dynamic(2) – ExpandoObject的使用" 了解了ExpandoObject的基本使用. 但ExpandoObject的问题就是它是一个万 ...
- 【Java】反射调用与面向对象结合使用产生的惊艳
缘起 我在看Spring的源码时,发现了一个隐藏的问题,就是父类方法(Method)在子类实例上的反射(Reflect)调用. 初次看到,感觉有些奇特,因为父类方法可能是抽象的或私有的,但我没有去怀疑 ...
- 惊艳!9个不可思议的 HTML5 Canvas 应用试验
HTML5 <canvas> 元素给网页中的视觉展示带来了革命性的变化.Canvas 能够实现各种让人惊叹的视觉效果和高效的动画,在这以前是需要 Flash 支持或者 JavaScript ...
- 使用 HTML5 Canvas 绘制出惊艳的水滴效果
HTML5 在不久前正式成为推荐标准,标志着全新的 Web 时代已经来临.在众多 HTML5 特性中,Canvas 元素用于在网页上绘制图形,该元素标签强大之处在于可以直接在 HTML 上进行图形操作 ...
- 分享10款效果惊艳的HTML5图片特效
在HTML5的世界里,图片特效都十分绚丽,我们在网站上也分享过很多不错的HTML5图片特效,现在我们精选10款效果惊艳的HTML5图片特效分享给大家. 1.HTML5 3D正方体旋转动画 很酷的3D特 ...
- 纯HTML+CSS写出一颗会飘动的树,有没有惊艳到你呢?
前言 使用HTML+CSS能写出什么惊人的效果呢? 针对这个问题,我总会看到类似的回答,比如没有JS,前端永远都是静态的:HTML5要搭配JS,要不然一文不值. JS固然强大,但CSS也并非一文不值, ...
- 惊艳的cygwin——Windows下的Linux命令行环境的配置和使用
http://www.tuicool.com/articles/2MramqI 时间 2014-07-29 09:28:36 点滴之间 聚沙成金 原文 http://www.path8.net/t ...
随机推荐
- C#中HttpClient使用注意:预热与长连接
最近在测试一个第三方API,准备集成在我们的网站应用中.API的调用使用的是.NET中的HttpClient,由于这个API会在关键业务中用到,对调用API的整体响应速度有严格要求,所以对HttpCl ...
- 【C#】组件发布:MessageTip,轻快型消息提示窗
-------------201610212046更新------------- 更新至2.0版,基本完全重写,重点: 改为基于原生LayeredWindow窗体和UpdateLayeredWindo ...
- js正则表达式校验非负浮点数:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 【Java每日一题】20161229
package Dec2016; import java.util.ArrayList; import java.util.List; public class Ques1229 { public s ...
- php调试工具——XDebug使用
下面以windows平台和Aptana Studio为例,介绍XDdebug的使用. 1.安装XDebug 1)下载php的XDebug扩展.dll文件,官网下载地址是https://xdebug.o ...
- Aix/Linux下自动备份oracle数据库
曾经有个同事,来回操作开发和生产的数据库,结果误删了生产的数据库,那种心情我想不是一般人能理解的,虽然说oracle可以有方法还原,但并不是彻底的. 所以,在工作中,不管是开发还是维护,备份数据库是非 ...
- 今天思考一个问题,PHP const和static的区别
static关键字在类中是,描述一个成员是静态的,static能够限制外部的访问,因为static后的成员是属于类的,是不属于任何对象实例,其他类是无法访问的,只对类的实例共享,能一定程序对该成员尽心 ...
- Qt 中使用Singleton模式需小心
在qt中,使用Singleton模式时一定要小心.因为Singleton模式中使用的是静态对象,静态对象是直到程序结束才被释放的,然而,一旦把该静态对象纳入了Qt的父子对象体系,就会导致不明确的行为. ...
- 《Web开发中块级元素与行内元素的区分》
一.块级元素的特性: 占据一整行,总是重起一行并且后面的元素也必须另起一行显示. HTML中块级元素列举如下: address(联系方式信息) article(文章内容) aside(伴随内容) au ...
- hexo博客-性能优化
前言 刚开始搭建博客的时候觉得很好玩,可是玩的久了,问题慢慢就出来了,就跟谈恋爱一样==.比如现在我访问博客的时候就感觉慢的要死,不可否认,使用hexo搭建服务器方便快捷,但是由于github作为服务 ...