zoukankan      html  css  js  c++  java
  • 用Delegate绕开频繁反射的又一个简单高效的方法

          前几天,写了一个绕开频繁反射的几个方案,其中有的比较简单,有的比较复杂。
          今天,无意中有发现了一个绝对简单的方案,适合不懂Emit的人群,而且简单到只需要一个泛型方法就可以了。
          下面请出今天的主角:Delegate,相信大家应该都很熟悉这个类,所有的委托类都是继承自它。但是它的作用可不仅仅是一个基类而已哦。它还拥有众多的静态方法可供我们使用,这次用到的就是一个叫CreateDelegate的方法。
          看一下这个方法的声明:public static Delegate CreateDelegate(Type type, object firstArgument, MethodInfo method);当然还有很多重载,今天,就用这个最简单的。
          关于这个方法,可以查阅MSDN的说明。简单的说,主要作用就是将一个MethodInfo实例变成一个type所指定的委托的实例。怎么做到的?用了两个CLR实现的方法(就是[MethodImpl(MethodImplOptions.InternalCall)]),因此实现方式不得而知。运用这个方法,可以非常简单的用下面这段代码实现一个将MethodInfo变成一个具体类型的委托:
            static T GetDelegate<T>(object instance, MethodInfo methodInfo)
                where T : 
    class
            {
                
    return Delegate.CreateDelegate(typeof(T), instance, methodInfo) as T;
            }

          简单吧,调用的时候,就只需要把T指定为符合MethodInfo所指向方法的签名一致的一个具体的Delegate类型,当是实例方法时,通过Instance传入实例,否则传空,MethodInfo就穿入反射获得的方法。一切就这么简单。
          至于性能,这个方式几乎接近直接调用(至少在我看来已经是属于误差的级别了)。
  • 相关阅读:
    Golang的演化历程
    优秀的计算机编程类博客和文章
    NET Portability Analyzer
    NET SqlClient
    Razor模板引擎
    js资源
    依赖注入和控制器
    Vue.js 2.0 和 React、Augular
    过滤器
    Prism vs MvvmCross
  • 原文地址:https://www.cnblogs.com/vwxyzh/p/803019.html
Copyright © 2011-2022 走看看