dynamic 动态类型 教你写不可思议的C#代码
2011-02-28 12:52
477 查看
虽然.NET4中已经引入了dynamic的动态类型,但是它相对于其他的来说还是不尽人意,不过下面要介绍的一个开源项目会让您能够写出不可思议的C#代码。
.Net 4 中引入了 dynamic 动态类型,这一消息确实让我们兴奋了一把,但是兴奋之余,又发现它相对于其他的动态语言来说还有不足之处。不过借助 CodePlex 上的一个开源项目 Clay,我们可以写出以下不可思议的代码,代码如下:
让我们先来看看是代码是如何的不可思议。
不可思议的对象初始化
新建 c# 项目,引用 Clay 项目(或其 dll), 并加入下面一行代码(建议看完本文再自行尝试):
先看下面的简单代码:
不足为奇,使用 .Net 4 中的 ExpandoObject 也能做到。
下面的代码就有点意思了:
这段代码和上面的效果是一样的,它使用索引器的方式为 person 的属性赋值,是不是有点类似 JavaScript?
再来看 jQuery 风格的代码:
还可以使用匿名类型方式:
甚至还可以使用命名参数方式:
不可思议吧!
综上所述,我们有多种方式始化实体设置属性值,以下方式都是等同的:
不可思议的 Array
我们可以创建 JavaScript 风格的 Array:
可如下操作这个集合:
我们还可以给实例动态增加 array 属性:
或者:
还能向集合中增加新的元素:
到这里,写出文首给出的 c# 代码应该不成问题了。
不可思议的动态接口实现
“动态接口实现”这个标题可能不太恰当,还是通过代码来说明问题吧。假定我们有如下接口:
可以如下使用:
只不过是我们通过 New.Person() 创建的一个动态对象,并没有实现 IPerson 接口啊,可就是能编译并运行通过:
![](http://images.51cto.com/files/uploadimg/20110223/0926250.png)
神奇吧!还不抓紧试试!
.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 接口啊,可就是能编译并运行通过:
![](http://images.51cto.com/files/uploadimg/20110223/0926250.png)
神奇吧!还不抓紧试试!
相关文章推荐
- C#4.0 dynamic动态类型
- C#基本语法 - .Net 4.0 之 Dynamic 动态类型
- Json.net实现方便的Json转C#(dynamic动态类型)对象
- C# 匿名对象(匿名类型)、var、动态类型 dynamic
- 编写高质量代码改善C#程序的157个建议[为类型输出格式化字符串、实现浅拷贝和深拷贝、用dynamic来优化反射]
- c# 把一个匿名对象赋值给一个Object类型的变量后,怎么取这个变量? c# dynamic动态类型和匿名类 详解C# 匿名对象(匿名类型)、var、动态类型 dynamic 深入浅析C#中的var和dynamic
- Json.net实现方便的Json转C#(dynamic动态类型)对象
- 详解C# 匿名对象(匿名类型)、var、动态类型 dynamic
- var和dynamic的应用 var、动态类型 dynamic 深入浅析C#中的var和dynamic ----demo
- C#4.0 新特性 动态类型Dynamic
- 编写高质量代码改善C#程序的157个建议[为类型输出格式化字符串、实现浅拷贝和深拷贝、用dynamic来优化反射]
- 分享一段C#反射代码-[Type是反射的入口]--[查看类型信息]--[动态生成对象]
- Json.net实现方便的Json转C#(dynamic动态类型)对象
- Json.net实现方便的Json转C#(dynamic动态类型)对象
- c# dynamic动态类型和匿名类
- C# 匿名对象(匿名类型)、var、动态类型 dynamic
- 潜移默化学会C#不常用语法-《1》-动态类型绑定dynamic
- dynamic基础类型/C#与动态脚本语言交互/dynamic自定义类型
- Json.net实现方便的Json转C#(dynamic动态类型)对象
- C# 匿名对象(匿名类型)、var、动态类型 dynamic