Clay 编写的 c 能否创造奇迹?

2026-05-27 05:121阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1015个文字,预计阅读时间需要5分钟。

Clay 编写的 c 能否创造奇迹?

在 .NET 4 中引入了 dynamic 动态类型,这让我们能够以一种更加灵活和创新的方式使用动态语言,而不仅仅是相对其他动态语言的改进。通过借助 CodePlex 上的开源项目 Clay,我们可以编写出如下难以想象的代码:v

.Net 4 中引入了 dynamic 动态类型,着实让我们兴奋的一把,不过相对其它动态语言, 还是有不少差距的。

不过借助 CodePlex 上的一个开源项目 Clay,我们可以写出以下不可思议的代码:

Clay 编写的 c 能否创造奇迹?

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 项目的网址是 clay.codeplex.com,目前没有发布好的下载,但我们可以直接下载它的源码:

Clay 目前主要应用于 Orchard 项目,请参见以下文章:

Clay: malleable C# dynamic objects – part 1: why we need it

Clay: malleable C# dynamic objects – part 2

本文改编自第二篇文章。

详细我就不多说了,留给大家讨论吧。

-------------------

思想火花,照亮世界

本文共计1015个文字,预计阅读时间需要5分钟。

Clay 编写的 c 能否创造奇迹?

在 .NET 4 中引入了 dynamic 动态类型,这让我们能够以一种更加灵活和创新的方式使用动态语言,而不仅仅是相对其他动态语言的改进。通过借助 CodePlex 上的开源项目 Clay,我们可以编写出如下难以想象的代码:v

.Net 4 中引入了 dynamic 动态类型,着实让我们兴奋的一把,不过相对其它动态语言, 还是有不少差距的。

不过借助 CodePlex 上的一个开源项目 Clay,我们可以写出以下不可思议的代码:

Clay 编写的 c 能否创造奇迹?

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 项目的网址是 clay.codeplex.com,目前没有发布好的下载,但我们可以直接下载它的源码:

Clay 目前主要应用于 Orchard 项目,请参见以下文章:

Clay: malleable C# dynamic objects – part 1: why we need it

Clay: malleable C# dynamic objects – part 2

本文改编自第二篇文章。

详细我就不多说了,留给大家讨论吧。

-------------------

思想火花,照亮世界