.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# 代码相关推荐

  1. 表示python代码块的是_编写高质量Python代码的59个有效方法,你用过几个

    欢迎点击右上角关注小编,除了分享技术文章之外还有很多福利,私信学习资料可以领取包括不限于Python实战演练.PDF电子文档.面试集锦.学习资料等. 这个周末断断续续的阅读完了<Effectiv ...

  2. keil debug如何在watch直接修改变量值_零基础学VBA:什么是VBA?如何编写和运行VBA代码?...

    HI,大家好,我是星光,今天咱们来继续学习VBA.在上一章咱们讲了为什么要学习VBA~VBA还值不值得学~学了还有没有用~零基础学VBA编程01:VBA还能不能学?学了还有没有用? 这一章咱们再来简单 ...

  3. 编写Python高质量代码,资深程序员的 91 个建议

    本文内容全部由 Python 编码的最佳实践组成,从基本原则.惯用法.语法.库.设计模式.内部机制.开发工具和性能优化 8 个方面深入探讨了编写高质量 Python 代码的技巧与禁忌,一共总结出 91 ...

  4. 13个有用的javascript开发人员工具,用于编写高质量的代码

    Today I'm going to show you 13 well-know and popular tools to write better and cleaner JavaScript co ...

  5. jmeter之java代码性能测试_松勤软件性能测试-自定义编写的Java测试代码在Jmeter中如何使用...

    原标题:松勤软件性能测试-自定义编写的Java测试代码在Jmeter中如何使用 我们在做性能测试时,有时需要自己编写测试脚本,很多测试工具都支持自定义编写测试脚本,比如LoadRunner就有很多自定 ...

  6. python中如何编写代码输入多个数据并把它们放在一个列表中去_编写高质量Python代码的59个有效方法,你用过几个...

    欢迎点击右上角关注小编,除了分享技术文章之外还有很多福利,私信学习资料可以领取包括不限于Python实战演练.PDF电子文档.面试集锦.学习资料等. 这个周末断断续续的阅读完了<Effectiv ...

  7. 用html编写一个贪吃蛇,HTML编写的贪吃蛇代码

    <HTML编写的贪吃蛇代码>由会员分享,可在线阅读,更多相关<HTML编写的贪吃蛇代码(14页珍藏版)>请在人人文库网上搜索. 1.使用表格 var fangxiang;fan ...

  8. 如何编写可测试的代码 哈利勒的方法论

    Understanding how to write testable code is one of the biggest frustrations I had when I finished sc ...

  9. html5转apicloud,使用APICloud编写优雅的HTML5代码

    使用APICloud编写优雅的HTML5代码<一>一.实现下拉刷新: 默认样式>代码清晰简洁明了,符合ECMA262规范的callback,最少只需5行代码: apiready = ...

  10. 《SQL与关系数据库理论——如何编写健壮的SQL代码》一第3章

    本节书摘来华章计算机<SQL与关系数据库理论--如何编写健壮的SQL代码>一书中的第3章 ,第3.1节 C. J. Date 著 单世民 何英昊 许侃 译 更多章节内容可以访问云栖社区&q ...

最新文章

  1. Zabbix 3.0 从入门到精通(zabbix使用详解)
  2. 怎么把ide改成ahci_如何将硬盘由IDE模式修改为AHCI模式,我的主板是华硕P8Z68-VLX,请高手帮帮忙。...
  3. 穿背心的老院士,86岁,重病,还在敲代码,单手!
  4. P4980-[模板]Pólya定理
  5. 音频信号发生器_1957年,DIY的Hi-Fi 电唱机单电子管音频发生器的音质保真度高...
  6. 考拉RPC(koalas-rpc v1.0)源码
  7. robotframework自动化测试修炼宝典_自动化测试之框架Cucumber和RobotFramework的实战对比...
  8. Nginx使用HTTPS建立与上游服务器的网络通信
  9. java 求集合真子集_【同步练习】高一高中数学必修1集合的关系与元素性质
  10. [GO]结构体及普通变量初始化
  11. 好程序员分享Web前端知识之HTML
  12. CS224N笔记(十):问答系统
  13. java 开三次根号_java里实现开根号
  14. 中国计算机学会推荐国际学术会议和期刊目录——A、B、C类期刊会议分级信息
  15. Linux 服务器乱码问题解决
  16. 吉他弹唱精通——运用空弦音的分解和弦
  17. 标准交换机和分布式交换机区别
  18. 过年烟花特效+鼠标滑过+樱花特效
  19. android应用间相互调用
  20. 阿迪达斯携手麦当劳推出篮球明星鞋服;拜耳联合导师计划支持中国医药初创企业 | 美通企业日报...

热门文章

  1. 876. Middle of the Linked List
  2. wordpress and theme
  3. POJ 2135 Farm Tour
  4. 【原】创建 WPF 不规则窗口
  5. 如何判断两物体加速度相等_高中物理知识点总结解题技巧:关联物体问题的求解方法...
  6. 手机清除微信内置浏览器缓存
  7. pycharm 激活
  8. 高级网络配置+Ipv6
  9. java:eclipse:windows开发环境log4j系统找不到指定的路径
  10. 运维自动化之zabbix(添加Graph screen)(3)