教你写不可思议的C
创始人
2024-07-21 10:11:24
0

   .Net 4 中引入了 dynamic 动态类型,这一消息确实让我们兴奋了一把,但是兴奋之余,又发现它相对于其他的动态语言来说还有不足之处。不过借助 CodePlex 上的一个开源项目 Clay,我们可以写出以下不可思议的代码,代码如下:

  1. var directory = New.Array(  
  2.     New.Person(  
  3.         FirstName: "Louis",  
  4.         LastName: "Dejardin",  
  5.         Aliases: new[] { "Lou" }  
  6.     ),  
  7.     New.Person(  
  8.         FirstName: "Bertrand",  
  9.         LastName: "Le Roy" 
  10.     ).Aliases("bleroy", "boudin"),  
  11.     New.Person(  
  12.         FirstName: "Renaud",  
  13.         LastName: "Paquay" 
  14.     ).Aliases("Your Scruminess", "Chef")  
  15. ).Name("Some Orchard folks"); 

       让我们先来看看是代码是如何的不可思议。

不可思议的对象初始化
新建 c# 项目,引用 Clay 项目(或其 dll), 并加入下面一行代码(建议看完本文再自行尝试):

  1. dynamic New = new ClayFactory(); 

先看下面的简单代码:

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

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

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

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

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

再来看 jQuery 风格的代码:

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

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

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

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

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

不可思议吧!

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

  1. person.FirstName  
  2. person["FirstName"]  
  3. person.FirstName() 

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

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

可如下操作这个集合:

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

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

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

或者:

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

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

  1. person.Aliases.Add("loudej"); 

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

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

  1. public interface IPerson {  
  2.     string FirstName { get; set; }  
  3.     string LastName { get; set; }  

可以如下使用:

  1. dynamic New = new ClayFactory();  
  2. var people = New.Array(  
  3.     New.Person().FirstName("Louis").LastName("Dejardin"),  
  4.     New.Person().FirstName("Bertrand").LastName("Le Roy")  
  5. );  
  6. IPerson lou = people[0];  
  7. var fullName = lou.FirstName + " " + lou.LastName; 

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

神器

 

神奇吧!还不抓紧试试!

   Clay 是 CodePlex 上的一个开源项目,帮助我们创建轻松创建对象,就 JavaScript 或其它动态语言一样简单。Clay 项目的网址是 http://clay.codeplex.com,目前没有发布好的下载,我们可以直接下载它的源码
 

【编辑推荐】

  1. Lambda简化C#编程学习心得
  2. C#图片处理的3种高级实用方法
  3. C#不如Java的地方:静态导入
  4. 10个C#编程和Visual Studio使用技巧

 

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...