替代反射调用的几种方式及性能测试

本文介绍了替代反射调用的三种方式:dynamic、Expression Tree 和 DynamicMethod,并进行了性能对比测试。结果显示,直接调用性能最佳,DynamicMethod 和 Expression Tree 性能接近,dynamic 中等,而反射性能最差。动态类型和表达式树是 .NET 4.0 及以后版本引入的,提供了更好的性能和便利性。
摘要由CSDN通过智能技术生成

园子里和这个话题的相关文章比较多,本文是旧话重提,外加个小的总结。主要因为近期看到很多同事、朋友都已经使用 VS2012 进行 .NET 4.5 开发了,却还在大量使用反射,不知道用新的方式。或有所了解,但又害怕性能不好不敢大胆去用。

本文以如下类为例:

public class MyMath
{ 
public int Add(int a, int b) {
return a + b; } }

替代反射的几种方式

倒序说吧,从最先进最简单的开始。

1. dynamic 调用

.NET 4 引入了 dynamic 类型,可以使用如下方式来完成对 MyMath.Add 方法的动态调用:

dynamic math = new MyMath();int result = math.Add(1, 2);


非常简单,效率也不错,可以看后面的性能对比测试结果。

但有一点要注意, dynamic 遵守 .NET 的访问级别限定,会对成员进行可见性检查。也就是说,只能 dynamic 调用 public 成员;当然,如果是同一程序集内部,internal 成员也是可以访问的。

2. Expression Tree 编译调用

Expression Tree 是 .NET 3.5 引入的。简单地,我们可以使用 lambda 构建一颗 Expression Tree:

var math = new MyMath();
Expression<Func<int, int, int>> add = (a, b) => math.Add(a, b);


这种方法适合手工编码构建,还有另外一种方式可以动态构建:

var add = typeof(MyMath).GetMethod("Add");
var math = Expression.Parameter(typeof(MyMath));
var a = Expression.Parameter(typeof(int), "a");
var b = Expression.Parameter(typeof(int), "b");
var body = Expression.Call(myMath, add, a, b);
var lambda = Expression.Lambda<Func<MyMath, int, int, int>>(body, math, a, b);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值