技术开发 频道

C#4.0新特性之动态查找

  2.DLR与自定义动态类型

  Dynamic Language Runtime是.Net 4.0中一组全新的API。对于C#,DLR提供了Microsoft.CSharp.RuntimeBinder命名空间[1],它为C#提供了强大的运行时互操作(COM,Ironpython等)能力,DLR也有优秀的缓存机制,对象一旦被成功绑定,CLR在下一次调用的时候就可以直接对确定类型的对象进行操作,而不必再通过DLR去lookup了。如果想在自己的代码中实现一个动态类型对象,可以继承DynamicObject[2]类,并实现自己的若干get和set方法。例如下面这个简单的例子:

 MyClass
  
public class MyClass:DynamicObject
  {
  
public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
  {
  result
= binder.Name;
  return
true;
  }
  }

 

  上述代码在尝试invoke某个方法的时候直接返回该方法的名字。于是下面的代码将输出方法名:

  代码


    dynamic d
= new MyClass();
  Console.WriteLine(d.AnyMember());

 

  3.dynamic的使用

  由于dynamic本身也是一个类型(虽然只有编译器认识它,运行时不认识它),而且dynamic实现了implicit和explicit运算符,理论上任何可以使用CLR的类型的地方都可以用dynamic。以下的代码是合法的:


    dynamic use
case
  dynamic d
= (dynamic)2;
  Action dAct
= new Action((dynamic n) => { Console.Write(n.GetType()+": "+n); });
  dAct(d);

 

  但是dynamic也不是功能较多的:

  1).目前动态查找不支持扩展方法的调用(可能在未来的版本的C#中会提供支持)。

  2).匿名方法和Lambda表达式不能转换为dynamic,也就是说dynamic d = x=>x;是不合法的,事实上lambda表达式也不能转成object。一样的道理,因为lambda表达式会在上下文环境下要么被编译器解释成委托类型,要么被解释成表达式树,但是如果上下文缺乏类型信息,编译器会confuse掉。

  4.总结

  dynamic是C#4.0的核心特征,感觉上是C#这种强类型的语言多了一些动态语言的特征,是对C#和.Net的一个完善。如本文开头所说,作为一门编程语言,C#正在猛练北冥神功[3] ,这样下去可能C#要和ms word一样成为居家旅行杀人越货必备的武器了。

  5.引用

  [1] http://msdn.microsoft.com/en-us/library/microsoft.csharp.runtimebinder(VS.100).aspx

  [2] http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject(VS.100).aspx

  [3] http://baike.baidu.com/view/146278.htm

0
相关文章