技术开发 频道

.Net 4.0新特性之Dynamic 动态类型

    【IT168 技术文档】本文主要旨在与网友分享.Net4.0的Dynamic 对Duck Type 的支持。

  一、.net4.0主要新特性

  .Net4.0在.Net3.5基础上新增的主要特性有:可选参数、命名参数和Dynamic。具体请阅生鱼片的这篇博文。这里我们着重讲解C#4.0的Dynamic特性,对于其他特性大家可以在VS2010内尝试一下。总之.Net在不断进步中。

  二、ExpandoObject普通应用

  ExpandoObject 类,“需引用System.Dynamic命名空间” 。请看以下代码:

dynamic Customer = new ExpandoObject();
Customer.Name
= "Lucy";
Customer.Age
= 20;
Customer.Female
= true;
Console.WriteLine(Customer.Name
+ Customer.Age + Customer.Female);
Console.ReadKey();

 

  输出<< Lucy20True,这里已经类似javascript 的var obj ={}; obj.Name ='lucy'。但又不完全相同,因为不能在clr运行时动态生成属性或者方法。但至少比.NET3.5先进了。

  三、Dynamic 动态类型对DuckType 的支持

  1.前不久看过这么一段代码:

static class Calculator
{    
public static T Add<T>(T t1, T t2) {        
dynamic d1
= t1;        
dynamic d2
= t2;        
return (T)(d1
+ d2);    
   }
}
public static void Main(string[] args){  
  
int i = Calculator.Add(1, 2);    
  
double d = Calculator.Add(1.1, 2.2);    
  
string s = Calculator.Add("abc", "def");    
  Console.WriteLine(i
+ " " + d + " " + s);
}

 

  输出:

  >>3 3.3 abcdef

  作者在文中指出了以上C#代码是为了通过动态类型来实现基于duck typing的泛型参数约束。

  为了在C#支持Duck Type还有一个重要的.Net4.0特性有必要提及到,这也是本文重点讨论的内容。

  它就是:“DynamicObject” 该类位于System.Dynamic 命名空间下。在VS2010内就可以看见该类的成员列表,截图如下:

1
 

  所属方法都是虚方法,我们可以重写这些虚方法。这里主要看TryInvokeMember()方法。这个方法VS2010给出了详细的描述。  

0
相关文章