一.Dynamic类型
C#4引入了dynamic关键字,用于定义变量;
dynamic myval;
它与var关键字不同,的确存在dynamic类型,所以无需初始化他的值;
dynamic类型不同寻常之处是,它仅在编译期间存在,在运行期间会被System.Objcet类型代替,这一点必须记住。
无论myval实际包含什么值,这行代码都会编译,但是如果所请求的成员不存在,在执行这行代码的时候会生成一个RuntimeBinderException类型的异常。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ComponentModel; using Microsoft.CSharp.RuntimeBinder; using System.Dynamic; namespace DynamicDemo { class MyClass1 { public int add(int var1,int var2) { return var1 + var2; } } class MyClass2 { } class Program { static int callCount = 0; static dynamic GetVlaue() { if (callCount++ == 0) { return new MyClass1(); } return new MyClass2(); } static void Main(string[] args) { try { dynamic firstresult = GetVlaue(); dynamic secondresult = GetVlaue(); Console.WriteLine("firstresult is {0}", firstresult.ToString()); Console.WriteLine("secondresult is {0}", secondresult.ToString()); Console.WriteLine("first call is {0}", firstresult.add(2,3)); Console.WriteLine("second call is {0}", secondresult.add(2, 3)); } catch (RuntimeBinderException ex) { Console.WriteLine(ex.Message); } Console.ReadLine(); } } }
dynamic也可以用于其他类型名的地方,例如
public int Add(dynamic var1,dynamic var2) { return var1+var2; }
Note:
应该注意如何使用动态类型,在运行期间对成员访问应用某种技术时会发生什么。实际上,有3种不同的方式访问成员:
- 如果动态值是COM(Component Object Model,组件对象模型)对象,就使用COM技术访问成员;
- 如果动态值支持IDynamicMetaObjectProvider接口,就使用该接口访问类型成员;
- 如果不成使用上面的技术,就使用反射(Reflection);