不可思议的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");
  让我们先来看看是代码是如何的不可思议
  不可思议的对象初始化
  新建 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;
  只不过是我们通过 New.Person() 创建的一个动态对象,并没有实现 IPerson 接口啊,可就是能编译并运行通过:

神奇吧!还不抓紧试试!

分享到: