C# 4.0 特性: dynamic 和 ExpandoObject

来源:互联网 发布:淘宝企业店铺有加权吗 编辑:程序博客网 时间:2024/05/18 03:06

C# 4.0引入了一个新类型:dynamic,简单来说,任何直接声明为这种类型的变量,或者从函数中返回这种类型的值,都将自动地视为后期绑定。即在运行时才会被初始化绑定。这类似于在Visual Basic中把变量声明为“object”,不过它现在可以支持任何类型系统了,不仅仅是CTS(通用类型规范)和COM。

C# 4.0 的主打特性就是动态类型。也就在这里体现。

在 New features in CSharp 4.docx 中提到 dymanic主要应用于下面的场景也是这样:

  • 自动反射
  • COM组件互操作
  • 混合编程,例如IronRuby和IronPython
  • 处理Html DOM对象

一个简单例子:

static void Main(string[] args){    dynamic person = new System.Dynamic.ExpandoObject();    person.Name = "cary";    person.Age = 25;    person.ShowDescription = new Func<string>(() => person.Name + person.Age);        Console.WriteLine(person.Name + person.Age + person.ShowDescription());    Console.ReadLine();}

这里的 System.Dynamic.ExpandoObject 是个特殊的对象,简单地说它的行为可以被“扩展”——是如动态语言般真正的扩展,而非静态的多态。当我们使用dynamic 饰变量后,在它之上的方法调用会由编译器和DLR配合出不一样的行为。例如,我们在调用一个方法的时候,DLR会先检查这个动态对象上是否存在符合这个签名的方法,存在则最好,否则便会调用TryInvokeMember来“执行”一个动态方法,而它的参数便是此次调用的全部信息。这样的做法被称为“Method Missing”操作。

DLR 和 CLR 以及编程语言的关系看下图:

image_thumb_2

 

注意点:

使用 Dynamic 将导致只能在运行时才能被测试。这就是为什么当你用dynamic类型时,单元测试在你的代码中变得很重要,很重要!!

 

参考资料:

C#4.0新特性:可选参数,命名参数,Dynamic
http://www.cnblogs.com/carysun/archive/2009/12/09/CSharp4.html

翻译:Visual C# 4.0的新特性-第三部分-Dynamic ExpendoObject
http://www.cnblogs.com/codeyu/archive/2009/12/08/1616839.html

C# 4.0中dynamic的用法
http://space.itpub.net/740297/viewspace-600670

介绍C# 4.0新特性dynamic
http://developer.51cto.com/art/200908/144976.htm

二十行C#代码打造Ruby Markup Builder
http://www.cnblogs.com/JeffreyZhao/archive/2009/10/27/implement-ruby-markup-builder-in-20-lines-of-c-sharp-codes.html

Dynamic in C# 4.0: Introducing the ExpandoObject
http://blogs.msdn.com/csharpfaq/archive/2009/10/01/dynamic-in-c-4-0-introducing-the-expandoobject.aspx

C#4.0的dynamic用法(一)——巧用反射
http://www.cnblogs.com/architect/archive/2009/03/13/1410921.html

C#动静结合编程之三:Duck Typing
http://www.cnblogs.com/weidagang2046/archive/2009/03/26/1421943.html

也谈.NET反射的封装
http://www.cnblogs.com/weidagang2046/archive/2009/04/30/1446928.html

C#动态特性的更多消息
http://www.infoq.com/cn/news/2009/04/Dynamic-CSharp

Fun With Method Missing and C# 4
http://haacked.com/archive/2009/08/26/method-missing-csharp-4.aspx