借助 Clay 编写不可思议的 c# 代码

标签: clay 不可思议 代码 | 发表时间:2011-02-22 21:42 | 作者:鹤冲天 CMGS
出处:http://www.cnblogs.com/

.Net 4 中引入了 dynamic 动态类型,着实让我们兴奋的一把,不过相对其它动态语言, 还是有不少差距的。

不过借助 CodePlex 上的一个开源项目 Clay,我们可以写出以下不可思议的代码:

var directory = New.Array(
    New.Person(
        FirstName: "Louis",
        LastName: "Dejardin",
        Aliases: new[] { "Lou" }
    ),
    New.Person(
        FirstName: "Bertrand",
        LastName: "Le Roy"
    ).Aliases("bleroy", "boudin"),
    New.Person(
        FirstName: "Renaud",
        LastName: "Paquay"
    ).Aliases("Your Scruminess", "Chef")
).Name("Some Orchard folks");

Clay 项目将在本文后面提到,我们先来看看是代码是如何的不可思议。

不可思议的对象初始化

新建 c# 项目,引用 Clay 项目(或其 dll), 并加入下面一行代码(建议看完本文再自行尝试):

dynamic New = new ClayFactory();

先看下面的简单代码:

var person = New.Person();
person.FirstName = "Louis";
person.LastName = "Dejardin";

不足为奇,使用 .Net 4 中的 ExpandoObject 也能做到。

下面的代码就有点意思了:

var person = New.Person();
person["FirstName"] = "Louis";
person["LastName"] = "Dejardin";

这段代码和上面的效果是一样的,它使用索引器的方式为 person 的属性赋值,是不是有点类似 JavaScript?

再来看 jQuery 风格的代码:

var person = New.Person()
    .FirstName("Louis")
    .LastName("Dejardin");

还可以使用匿名类型方式:

var person = New.Person(new {
    FirstName = "Louis",
    LastName = "Dejardin"
});

甚至还可以使用命名参数方式:

var person = New.Person(
    FirstName: "Louis",
    LastName: "Dejardin"
);

不可思议吧!

综上所述,我们有多种方式始化实体设置属性值,以下方式都是等同的:

person.FirstName
person["FirstName"]
person.FirstName()

不可思议的 Array

我们可以创建 JavaScript 风格的 Array:

var people = New.Array(
    New.Person().FirstName("Louis").LastName("Dejardin"),
    New.Person().FirstName("Bertrand").LastName("Le Roy")
);

可如下操作这个集合:

int count = people.Count;
string firstName = people[0].FirstName;

我们还可以给实例动态增加 array 属性:

person.Aliases("bleroy", "BoudinFatal");

或者:

person.Aliases(new[] {"Lou"});

还能向集合中增加新的元素:

person.Aliases.Add("loudej");

到这里,写出文首给出的 c# 代码应该不成问题了。

不可思议的动态接口实现

“动态接口实现”这个标题可能不太恰当,还是通过代码来说明问题吧。假定我们有如下接口:

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;

people[0] 只不过是我们通过 New.Person() 创建的一个动态对象,并没有实现 IPerson 接口啊,可就是能编译并运行通过:

Clay

神奇吧!还不抓紧试试!

Clay 项目

Clay 是 CodePlex 上的一个开源项目,帮助我们创建轻松创建对象,就 JavaScript 或其它动态语言一样简单。

Clay 项目的网址是 http://clay.codeplex.com,目前没有发布好的下载,但我们可以直接下载它的源码:

ClayDownload

Clay 目前主要应用于 Orchard 项目,请参见以下文章:

Clay: malleable C# dynamic objects – part 1: why we need it 

Clay: malleable C# dynamic objects – part 2

本文改编自第二篇文章。

详细我就不多说了,留给大家讨论吧。

作者: 鹤冲天 发表于 2011-02-22 21:42 原文链接

评论: 41 查看评论 发表评论


最新新闻:
· 卡巴斯基手机安全开通Android、黑莓支持(2011-02-23 15:26)
· Facebook创始人扎克伯格漫画传记出版(2011-02-23 14:57)
· 大教堂理论与软件生态环境的构建(2011-02-23 14:45)
· 手机钱包化:漫谈移动支付(2011-02-23 14:40)
· 苹果发布第6代iPod nano升级软件(2011-02-23 14:23)

编辑推荐:REST服务开发实战

网站导航:博客园首页  我的园子  新闻  闪存  小组  博问  知识库

相关 [clay 不可思议 代码] 推荐:

借助 Clay 编写不可思议的 c# 代码

- CMGS - 博客园-首页原创精华区
.Net 4 中引入了 dynamic 动态类型,着实让我们兴奋的一把,不过相对其它动态语言, 还是有不少差距的. 不过借助 CodePlex 上的一个开源项目 Clay,我们可以写出以下不可思议的代码:. Clay 项目将在本文后面提到,我们先来看看是代码是如何的不可思议. 新建 c# 项目,引用 Clay 项目(或其 dll), 并加入下面一行代码(建议看完本文再自行尝试):.

最不可思议的字排肖像

- 大栋 - 译言-每日精品译文推荐
来源The Most Incredible Typographic Portraits | Top Design Magazine - Web Design and Digital Content. You must know how to select typefaces, point sizes, how to adjusts spaces between groups of letters and between pairs of letters.

令人不可思议的摇钱树

- Yu - 玩意儿
摇钱树只是我们幻想中的东东,而在英国的林地里,真的就出现了一群树,上面长满了硬币. 通常我们有各种的许愿方式,向池塘中投入硬币等等,在这里是过路的人们,利用石头将硬币砸入树干内祈福. 这些硬币,最久的有上百年得历史,通过树慢慢的增长,它们在树干上彻底显现了出来. 本文原始链接:http://www.cngadget.cn/unbelievable-money-trees.html.

不可思议的教堂设计

- 玄之又玄 - 设计|生活|发现新鲜
来自比利时年轻建筑师Pieterjan Gijs你简直就是天才,这教堂的设计未免太帅了吧,整个场面方面几公里都被你hold住. 十米高的教堂的全部由100层已经风化表面锈迹斑斑的钢板搭建而成. 这种通透式的建筑在夕阳的余晖下显得格外亮眼. 想必来这间教堂祷告的人一定爆多. 「设计,生活,发现新鲜」在新浪微博,更即时地获读更新,更直接地交流沟通.

不可思议的巨蟒心脏

- Adam - Solidot
缅甸蟒蛇伸长超过五米,身体具有不可思议的膨胀能力. 它经常几个月不吃东西,然后再饱餐一顿. 有时它能吞下整只鹿,身体像气球一样膨胀起来,新陈代谢增加40多倍,包括消化道在内的许多器官会扩大一倍,心脏增大40%,为整个身体泵出更多血. 科罗拉多大学博尔德分校分子生物学家Leslie Leinwand想知道这一切是如何发生的.

30个不可思议的Photoshop教程

- 和谐牌河蟹 - Jackchen Design 1984
我们都说艺术家的内心有着深不可知的梦境. 如果说摄影师可以让时间停止,那么设计师都是超意识的去感知平常人未知的世界. 在他们内心看到的是各种无法想象. 这样的人从人类的开始就已经存在,他们记录现实想象未来,在深邃的山洞峭壁上展现无法想象的思绪. 而对于现在,科技让设计师插上翅膀,各种软硬设配让设计师的梦境一一呈现.

不可思议的箱子:你的一生就在里面

- RZ - 果壳网 guokr.com - 果壳网
如果有人说,你的一生其实就如同被装在一个箱子里面,你会相信吗. 你的一生,不会像广告所说的那样“精彩无极限”,我们每天能看到的图像和听到的声音,其可能性其实只是有限多种. 每个人都或多或少都看过一些高清电影,比如说一部1080p(1080p:垂直方向1080行逐行扫描合成一帧图像)的《致命魔术》. 它的分辨率为1920*1080,也就是说这样的一部电影中的任意一个镜头都含有2073600≈2.1M个像素点.

谷奥: Google 为我们解析“不可思议”是什么

- Jo - 谷奥聚合——谷奥主站+谷安 aggregator
想知道什么是不可思议,Google 来告诉你. 将“不可思议”作为关键词,扔进 Google.com.hk 的搜索框,别急着按回车,将鼠标移动到 Google 搜索按钮上,闭上眼,深呼吸~手指在鼠标上用力的按一下. 看到结果上方计算器的 onebox 了吗. 不可思议 = 1.0 x 10^64. UPDATE:感谢读者 francis 在留言中的提醒,原来这个火星了,与G共舞早在2008年就做过相关报道并且解释过:.

Julien Vallee 带来的不可思议的纸工艺设计

- Zephyr - Design lol 全球设计精华分享
Julien Vallee 是加拿大蒙特利尔的艺术总监. 他最喜欢的材料是纸,使用纸的立体造型,层次感和丰富的色彩,在物理世界中制作出令人惊叹的视觉效果. 详情查看原文: Incredible Paper Artwork by Julien Vallée.

不可思议的立体纸塑艺术

- 颖 - 译言-每日精品译文推荐
来源Incredible Paper Art. 2011年1月10日| 灵感 |. Cheong-ah Hwang(韩国艺术家,译者注)用纸创作了各种很棒的立体形象. 该艺术家喜欢用纸进行创作,因为纸可以变化多样,是人们日常生活中常用的材料. 欧比旺·肯诺比(Obi Wan Kenobi).   \"大图\"与\"小事\".