作者:Justrun名字来自《阿甘正传》,是希望自己能够更更傻一点。

link: http://www.cnblogs.com/JustRun1983/p/3529157.html

 

理解C# 4 dynamic(4) – 让人惊艳的Clay(转)

2014-01-22 07:27 by JustRun, 8360 阅读, 38 评论, 收藏, 编辑

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

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

  1. 理解C# 4 dynamic(4) – 让人惊艳的Clay

    Clay非常类似于ExpandoObject, 可以看做是ExpandoObject的加强版. 它们能够让我们在不需要定义类的情况下,就构建出我们想要的对象.Clay和ExpandoObject相比, ...

  2. 理解C# 4 dynamic(2) – ExpandoObject的使用

    ExpandoObject的使用非常简单,很容易入手.上一篇里面已经有详细的介绍了,可以看这里(理解C# 4 dynamic(1) - var, object, dynamic的区别以及dynamic ...

  3. 理解C# 4 dynamic(3) – DynamicObject的使用

    上篇文章"理解C# 4 dynamic(2) – ExpandoObject的使用" 了解了ExpandoObject的基本使用. 但ExpandoObject的问题就是它是一个万 ...

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

    缘起 我在看Spring的源码时,发现了一个隐藏的问题,就是父类方法(Method)在子类实例上的反射(Reflect)调用. 初次看到,感觉有些奇特,因为父类方法可能是抽象的或私有的,但我没有去怀疑 ...

  5. 惊艳!9个不可思议的 HTML5 Canvas 应用试验

    HTML5 <canvas> 元素给网页中的视觉展示带来了革命性的变化.Canvas 能够实现各种让人惊叹的视觉效果和高效的动画,在这以前是需要 Flash 支持或者 JavaScript ...

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

    HTML5 在不久前正式成为推荐标准,标志着全新的 Web 时代已经来临.在众多 HTML5 特性中,Canvas 元素用于在网页上绘制图形,该元素标签强大之处在于可以直接在 HTML 上进行图形操作 ...

  7. 分享10款效果惊艳的HTML5图片特效

    在HTML5的世界里,图片特效都十分绚丽,我们在网站上也分享过很多不错的HTML5图片特效,现在我们精选10款效果惊艳的HTML5图片特效分享给大家. 1.HTML5 3D正方体旋转动画 很酷的3D特 ...

  8. 纯HTML+CSS写出一颗会飘动的树,有没有惊艳到你呢?

    前言 使用HTML+CSS能写出什么惊人的效果呢? 针对这个问题,我总会看到类似的回答,比如没有JS,前端永远都是静态的:HTML5要搭配JS,要不然一文不值. JS固然强大,但CSS也并非一文不值, ...

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

    http://www.tuicool.com/articles/2MramqI 时间 2014-07-29 09:28:36  点滴之间 聚沙成金 原文  http://www.path8.net/t ...

随机推荐

  1. linux下informatica服务安装和配置

    本文中将会用infa简称代替informatica 1.安装前准备 介质名称 版本信息 描述 Informatica Powercenter 9.5.1 for Linux 64 bit 必须 Jav ...

  2. Sublime Text 编辑器的设定

    # Sublime Text 编辑器的设定 > gloal setting ```{    "caret_style": "smooth",    &qu ...

  3. 发现TypeScript中同名interface接口会自动合并的特性

    今天在学习怎么用TypeScript给jQuery写扩展插件时发现一个很有趣的事情

  4. 将int转int数组并将int数组元素处理后转int,实现加密

    package faceobject; import java.util.Arrays; public class Test { /** 加密问题 数据是小于8位的整数 先将数据倒序,然后将每位数字都 ...

  5. 『转』Bitdefender Internet Security 2013 – 免费1年

    活动中可以选择获取Bitdefender Internet Security 2013+Bitdefender Mobile Security (手机版)各一年激活码申请地址:https://part ...

  6. 实现C++标准库string类的简单版本

    代码如下: #ifndef STRING_H #define STRING_H #include <cassert> #include <utility> #include & ...

  7. WebGL编程指南案例解析之绘制四边形

    //案例4,绘制矩形,和三角形类似,但是注意因为一个矩形有4个顶点,按照两个三角形绘制矩形的话,顶点顺序要注意 var vShader = ` attribute vec4 a_Position; v ...

  8. Ubuntu用户管理

    本文主要介绍Ubuntu的用户管理,包括建立和删除用户,用户授权等 ================== 创建用户并授权================== sudo adduser xxx 会在ho ...

  9. 走在linux 的路上

    终于现在不看鸟哥的私房菜基础篇了,以后再慢慢看,像我这种初学者,感觉还是不太适合看鸟哥的私房菜. 于是从图书馆借了本书继续学习我的linux. 这样看着linux容易多了,进而熟悉了几个命令:ls c ...

  10. Jmeter-Transaction Controller(事务控制器)

    generate parent sample:生成父样本 include duration of timer and pre-post processors in generated sample:在 ...