借助 Clay 编写 不可思议 的 c# 代码
.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 是 CodePlex 上的一个开源项目,帮助我们创建轻松创建对象,就 JavaScript 或其它动态语言一样简单。
Clay 项目的网址是 http://clay.codeplex.com,目前没有发布好的下载,但我们可以直接下载它的源码:
Clay 目前主要应用于 Orchard 项目,请参见以下文章:
Clay: malleable C# dynamic objects – part 1: why we need it
Clay: malleable C# dynamic objects – part 2
本文改编自第二篇文章。
详细我就不多说了,留给大家讨论吧。
借助 Clay 编写 不可思议 的 c# 代码相关推荐
- 表示python代码块的是_编写高质量Python代码的59个有效方法,你用过几个
欢迎点击右上角关注小编,除了分享技术文章之外还有很多福利,私信学习资料可以领取包括不限于Python实战演练.PDF电子文档.面试集锦.学习资料等. 这个周末断断续续的阅读完了<Effectiv ...
- keil debug如何在watch直接修改变量值_零基础学VBA:什么是VBA?如何编写和运行VBA代码?...
HI,大家好,我是星光,今天咱们来继续学习VBA.在上一章咱们讲了为什么要学习VBA~VBA还值不值得学~学了还有没有用~零基础学VBA编程01:VBA还能不能学?学了还有没有用? 这一章咱们再来简单 ...
- 编写Python高质量代码,资深程序员的 91 个建议
本文内容全部由 Python 编码的最佳实践组成,从基本原则.惯用法.语法.库.设计模式.内部机制.开发工具和性能优化 8 个方面深入探讨了编写高质量 Python 代码的技巧与禁忌,一共总结出 91 ...
- 13个有用的javascript开发人员工具,用于编写高质量的代码
Today I'm going to show you 13 well-know and popular tools to write better and cleaner JavaScript co ...
- jmeter之java代码性能测试_松勤软件性能测试-自定义编写的Java测试代码在Jmeter中如何使用...
原标题:松勤软件性能测试-自定义编写的Java测试代码在Jmeter中如何使用 我们在做性能测试时,有时需要自己编写测试脚本,很多测试工具都支持自定义编写测试脚本,比如LoadRunner就有很多自定 ...
- python中如何编写代码输入多个数据并把它们放在一个列表中去_编写高质量Python代码的59个有效方法,你用过几个...
欢迎点击右上角关注小编,除了分享技术文章之外还有很多福利,私信学习资料可以领取包括不限于Python实战演练.PDF电子文档.面试集锦.学习资料等. 这个周末断断续续的阅读完了<Effectiv ...
- 用html编写一个贪吃蛇,HTML编写的贪吃蛇代码
<HTML编写的贪吃蛇代码>由会员分享,可在线阅读,更多相关<HTML编写的贪吃蛇代码(14页珍藏版)>请在人人文库网上搜索. 1.使用表格 var fangxiang;fan ...
- 如何编写可测试的代码 哈利勒的方法论
Understanding how to write testable code is one of the biggest frustrations I had when I finished sc ...
- html5转apicloud,使用APICloud编写优雅的HTML5代码
使用APICloud编写优雅的HTML5代码<一>一.实现下拉刷新: 默认样式>代码清晰简洁明了,符合ECMA262规范的callback,最少只需5行代码: apiready = ...
- 《SQL与关系数据库理论——如何编写健壮的SQL代码》一第3章
本节书摘来华章计算机<SQL与关系数据库理论--如何编写健壮的SQL代码>一书中的第3章 ,第3.1节 C. J. Date 著 单世民 何英昊 许侃 译 更多章节内容可以访问云栖社区&q ...
最新文章
- Zabbix 3.0 从入门到精通(zabbix使用详解)
- 怎么把ide改成ahci_如何将硬盘由IDE模式修改为AHCI模式,我的主板是华硕P8Z68-VLX,请高手帮帮忙。...
- 穿背心的老院士,86岁,重病,还在敲代码,单手!
- P4980-[模板]Pólya定理
- 音频信号发生器_1957年,DIY的Hi-Fi 电唱机单电子管音频发生器的音质保真度高...
- 考拉RPC(koalas-rpc v1.0)源码
- robotframework自动化测试修炼宝典_自动化测试之框架Cucumber和RobotFramework的实战对比...
- Nginx使用HTTPS建立与上游服务器的网络通信
- java 求集合真子集_【同步练习】高一高中数学必修1集合的关系与元素性质
- [GO]结构体及普通变量初始化
- 好程序员分享Web前端知识之HTML
- CS224N笔记(十):问答系统
- java 开三次根号_java里实现开根号
- 中国计算机学会推荐国际学术会议和期刊目录——A、B、C类期刊会议分级信息
- Linux 服务器乱码问题解决
- 吉他弹唱精通——运用空弦音的分解和弦
- 标准交换机和分布式交换机区别
- 过年烟花特效+鼠标滑过+樱花特效
- android应用间相互调用
- 阿迪达斯携手麦当劳推出篮球明星鞋服;拜耳联合导师计划支持中国医药初创企业 | 美通企业日报...