使用dynamic来简化反射实现
分类:
IT文章
•
2025-02-02 22:27:19
dynamic是Framework4.0的新特性。dynamic的出现让C#具有弱语言类型特性。编译器在编译的时候不再对类型进行检查,编译器默认dynamic对象支持开发者想要的任何特性。
比如,即使你对GetDynamicObject方法返回的对象一无所知,也可以像如下这样进行代码的调用,编译器不会报错。
1 dynamic dynamicObject=GetDynamicObject();
2 Console.WriteLine(dynamicObject.Name);
3 Console.WriteLine(dynamicObject.SampleMethod());
View Code
当然,如果运行时dynamicObject不包含指定的这些特性(如上文中带返回值的方法SampleMethod),运行时程序会抛出一个RuntimeBinderException异常:
“System.Dynamic.ExpandoObject”未包含“SampleMethod”的定义。
利用dynamic的这个特性,可以简化C#中的反射语法。在dynamic出现之前,假设存在类,代码如下所示:
1 public class DynamicSample
2 {
3 public string Name{get;set;}
4 public int Add(int a,int b)
5 {
6 return a+b;
7 }
8 }
View Code
我们这样使用反射,调用如下方法:
1 DynamicSample dynamicSample=new DynamicSample();
2 var addMethod=typeof(DynamicSample).GetMethod("Add");
3 int result=(int)addMethod.Invoke(dynamicSample,new object[]{1,2});
在使用dynamic后,代码看上去更简洁了,并且在可控的范围内减少了异常拆箱的机会,代码如下所示:
1 DynamicSample dynamicSample2=new DynamicSample();
2 int result2=dynamicDample.Add(1,2);
我们可能会对这样的简化不以为然,毕竟代码看起来并没有减少多少,但是,如果考虑到效率兼优美两个特性,那么dynamic的优势就凸显出来了。如果对上面的代码执行1000000次,如下代码:
1 int times = 1000000;
2 DynamicSample refSample = new DynamicSample();
3 var addMethod = typeof(DynamicSample).GetMethod("Add");
4 Stopwatch sw = Stopwatch.StartNew();
5 for (int i = 0; i < times; i++)
6 {
7 addMethod.Invoke(refSample, new object[] { 1, 2 });
8 }
9 Console.WriteLine(string.Format("反射耗时:{0}毫秒",sw.ElapsedMilliseconds));
10 dynamic dynamicSample = new DynamicSample();
11 Stopwatch sw2 = Stopwatch.StartNew();
12 for (int i = 0; i < times; i++)
13 {
14 dynamicSample.Add(1, 2);
15 }
16 Console.WriteLine(string.Format("dynamic耗时:{0}毫秒",sw2.ElapsedMilliseconds));
View Code