使用表达式树提升反射性能

本文探讨了如何使用.NET的Expression Tree提升反射性能,通过创建委托以接近编译时速度访问属性、字段和方法。文章介绍了泛型委托、DynamicMethod以及Expression Tree的使用,并提供了非泛型方式获取和设置属性、字段以及调用方法的示例代码。然而,对于处理带ref参数的方法,作者提出了一种挑战,目前尚未找到解决方案。
摘要由CSDN通过智能技术生成

     反射是日常编码中不可或缺的重要特性但是大规模应用又会造成性能问题,因此很多人都写了提升反射速度的辅助类库。在.net1.1时代主要应用Emit自己构造IL,这需要你精通IL而且还不能怕麻烦。而在.net2.0时代由于引入了泛型使我们可以利用泛型委托来减少一部分IL Emit过程(详见这里),但是泛型是编译时确定的而我们更多的应用是在运行时得到或设置对象的属性,及动态执行方法。好在.net2.0又新增了一个辅助类DynamicMethod来帮助我们进行Emit编程(详见这里)。如今.net3.5了微软又给了我们更强大的武器Expression Tree(详见这里这里),利用它我们就可以避免使用复杂的IL而可以从更抽象更高级的角度来动态Emit我们需要的东西。是不是觉得.net发展越来越人性化呢易用话呢?就在我写这篇文章的时候c#4.0的duck type估计已经出炉了,到时候Emit这技术也没多大用了完全都是微软替们我们搞定了(虽然编程的门槛降低了程序员越来越多了但我相信这些底层技术还是很有必要学习的,因为底层技术是一种解决问题的思路就像算法)。

    首先我要说明一下快速反射的原理:用委托来间接操作我们要Get,Set的属性、字段和要动态执行的方法。下面我以得到字段的值来举例说明。假设有一个User类定义如下:

  1. public class User
  2. {
  3.     public int _age;
  4.     public int Age
  5.     {
  6.         getreturn this._age; }
  7.         setthis._age = value;}
  8.     }
  9. }

用传统的反射方法是这样的:

  1. User u = new User();
  2. u.Age = 26;
  3. PropertyInfo p = typeof(Employee).GetProperty("Age");
  4. int age = Convert.ToInt32(p.GetValue(u, null));

而使用快速反射的思路我们就要先拿到访问属性Age的MethodInfo然后构建一个Delegate,然后我们就能以调用函数的速度来动态取得Age属性

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值