dynamic 动态类型 教你写不可思议的C#代码

  • 虽然.NET4中已经引入了dynamic的动态类型,但是它相对于其他的来说还是不尽人意,不过下面要介绍的一个开源项目会让您能够写出不可思议的C#代码。
  •  

       .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 { getset; }  
    3.     string LastName { getset; }  

    可以如下使用:

      
      
    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 接口啊,可就是能编译并运行通过:

    神器

     

    神奇吧!还不抓紧试试!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值