理解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

时间: 2024-08-10 08:53:41

理解C# 4 dynamic(4) – 让人惊艳的Clay的相关文章

身边朋友的哪些不起眼的生活方式惊艳到你了

作者:刘鹏程Sai.L链接:https://www.zhihu.com/question/68209502/answer/263956470来源:知乎认识的人当中,最让我惊艳也是对我生活影响最大的一位,是我在券商上班时认识的一位股民大叔, 大叔姓李,国企职工,比我父亲小6-7岁,不喜欢被叫李叔,习惯被称为老李. 券商的老式基层营业部通常有大户室,户室按照资金不同划分,资金量越高的户室环节越好,分别是10万级别,30万级别,50万级别和80万以上级别. 我刚到的时候老李在50万级别的户室混,到我离

MNC:惊艳时光的推荐!

新栏目了! MUSIC NEW COLUMN 总有一些歌令人难忘. 就像有些人惊艳了时光. 或许制作它们的人并不是那么的棒 但是,他们的手里却诞生了如此美妙的 令人难忘的那些音乐. 一.2017/07/16 Glorious morning 二.2017/07/16 Summer 三.2017/07/16 道标

理解C# 4 dynamic(1) - var, object, dynamic的区别以及dynamic的使用

原文:理解C# 4 dynamic(1) - var, object, dynamic的区别以及dynamic的使用 阅读目录: 一. 为什么是它们三个 二. 能够任意赋值的原因 三. dynamic的用法 四. 使用dynamic的注意事项 一. 为什么是它们三个? 拿这三者比较的原因是它们在使用的时候非常相似.你可以用它们声明的变量赋任何类型的值. 看看下面的示例: var a = 1; object b = 1; dynamic c = 1; 你还可以使用关键字为它们赋上更加复杂的类型 v

【Java】反射调用与面向对象结合使用产生的惊艳

缘起 我在看Spring的源码时,发现了一个隐藏的问题,就是父类方法(Method)在子类实例上的反射(Reflect)调用. 初次看到,感觉有些奇特,因为父类方法可能是抽象的或私有的,但我没有去怀疑什么,这可是Spring的源码,肯定不会有错. 不过我去做了测试,发现确实是正确的,那一瞬间竟然给我了一丝的惊艳. 这其实是面向对象(继承与重写,即多态)和反射结合的产物.下面先来看测试,最后再进行总结. 友情提示:测试内容较多,不过还是值得一看. 具体方法的继承与重写 先准备一个父类,有三个方法,

人生,懂得相知,相惜包容之心不易。若灵犀一处,注定单一的风景,那就让生命于孤独中,开成一朵惊艳的花来,所有的资本,独倾城于自己!百度几下,你就知道,还得问百度

人生,懂得相知,相惜包容之心不易.若灵犀一处,注定单一的风景,那就让生命于孤独中,开成一朵惊艳的花来,所有的资本,独倾城于自己! ————题记 又是下雨的天气,青石板的湿气寒生,缝隙边的小草,漫步一春,一夏,一秋,于这冬天,仿佛还在执意某个角落,安定一个归属,定要等到霜雪满天,才肯凋谢! 若可,我愿是丁香般的女子,无须为了谁而忧怨,更无需丈量光阴给予的深浅,只管停泊江南的一席之地,为自己开一扇幽窗,与书共知己.风来且沐浴,月倚枕边书:雨临相对盏,醉赋宋唐风:再植一盆盆的兰草,便可举杯邀月兰生慧,

惊艳的cygwin——Windows下的Linux命令行环境的配置和使用

http://www.tuicool.com/articles/2MramqI 时间 2014-07-29 09:28:36  点滴之间 聚沙成金 原文  http://www.path8.net/tn/archives/6021 主题 CygwinLinux命令 本文内容遵从 CC版权协议 , 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://oldratlee.com/post/2012-12-22/stunning-cygwin N年前倒腾过一次 

漂亮的女人惊艳世界,伟大的女人改变世界

生而为人,多数人都不是含着金钥匙出生于名门望族,也并非出身于三餐不饱的寒门之地. 我们多是像她一样,生来就是平凡的普通人. 这个叫萨尔玛·贝娜妮的姑娘于1978年5月10日出生在北非国家摩洛哥.跟你我一样,她是一个再平凡不过的姑娘,但3岁那年母亲去世,让她比普通人更加可怜. 年幼的姑娘离开她那当老师的父亲,跟随外婆长大. 人总要努力一些,珍惜生命中所有的机会,才能活出自己想要的样子. 在阿拉伯国家摩洛哥,女性的地位低得可怜,有多可怜?就连国家的第一夫人都不能在公众场合抛头露面,至于平民家的女性?

Linux和类Unix系统上5个惊艳的开源备份软件(转)

一个好的备份计划是非常必要的,这样可以有能力恢复被下面几种情形顺坏的数据: 人为损坏 RAID或者磁盘损坏 文件系统损坏 数据中心损毁以及其它 在这篇文章里我会给你列举一些惊艳的开源备份软件. 当给企业选择备份软件的时候应该注意什么? 确保你部署的备份软件支持以下特性: 1.开源软件:你必须使用那些源代码可以被自由修改的软件.这样即使项目停止了或者没有补丁更新也可以确保你能恢复数据. 2.跨平台支持:确保备份软件可以在各种桌面和服务器操作系统上工作. 3.数据格式:开放的数据格式可以确保你能在项

使用 HTML5 Canvas 绘制出惊艳的水滴效果

HTML5 在不久前正式成为推荐标准,标志着全新的 Web 时代已经来临.在众多 HTML5 特性中,Canvas 元素用于在网页上绘制图形,该元素标签强大之处在于可以直接在 HTML 上进行图形操作,具有极大的应用价值. 这里分享一个惊艳的 Canvas 水滴效果,双击可以把水滴分离:拖放到一起可以融合:晃动浏览器可以让水滴跳动:键盘左右键可以切换皮肤:上下键可以变换大小. 在线演示      插件下载 您可能感兴趣的相关文章 网站开发中很有用的 jQuery 效果[附源码] 分享35个让人惊