找回密码
 立即注册
首页 业界区 业界 借助 Clay 编写不可思议的 c# 代码

借助 Clay 编写不可思议的 c# 代码

筒濂 2025-5-29 15:39:48
.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");
复制代码
Clay 项目将在本文后面提到,我们先来看看是代码是如何的不可思议。
不可思议的对象初始化

新建 c# 项目,引用 Clay 项目(或其 dll), 并加入下面一行代码(建议看完本文再自行尝试):
  1. dynamic New = new ClayFactory();
复制代码
先看下面的简单代码:
  1. var person = New.Person();
  2. person.FirstName = "Louis";<br>person.LastName = "Dejardin";
复制代码
不足为奇,使用 .Net 4 中的 ExpandoObject 也能做到。
下面的代码就有点意思了:
  1. var person = New.Person();<br>person["FirstName"] = "Louis";<br>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; }
  4. }
复制代码
可以如下使用:
  1. dynamic New = new ClayFactory();var people = New.Array(
  2.     New.Person().FirstName("Louis").LastName("Dejardin"),
  3.     New.Person().FirstName("Bertrand").LastName("Le Roy")
  4. );IPerson lou = people[0];var fullName = lou.FirstName + " " + lou.LastName;
复制代码
people[0] 只不过是我们通过 New.Person() 创建的一个动态对象,并没有实现 IPerson 接口啊,可就是能编译并运行通过:
1.png

神奇吧!还不抓紧试试!
Clay 项目

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

Clay 目前主要应用于 Orchard 项目,请参见以下文章:
Clay: malleable C# dynamic objects – part 1: why we need it 
Clay: malleable C# dynamic objects – part 2
本文改编自第二篇文章。
详细我就不多说了,留给大家讨论吧。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册