在前面的文章改进的“以非泛型方式调用泛型方法”之基于DynamicMethod的实现中,提到了一种通过DynamicMethod以非泛型方法代理访问泛型方法的较佳方法(无额外代码定义需要,执行时间大约相当于直接调用泛型方法的3-4倍)。本文介绍的组件在前文思路的基础上,进行进一步的扩展,封装成一个较通用的DynamicMethodProxyFactory组件。除了可以较高性能访问任意的静态或非静态、泛型或非泛行方法之外,利用DynamicMethod可将代码插入内存中已载入的Module的能力,提供了在程序集外实例化指定Module中的internal类型,在程序集外调用internal类型的方法和public类型的internal方法的支持。

该组件实现如下功能:
1、以通用的非泛行方法Delegate访问任意方法(泛型或非泛型,静态或非静态);
2、支持在程序集外调用指定Module中的internal类型的任意属性(属性本质上可以通过它的get/set方法以方法的形式访问)和方法和public类型的internal方法;
3、支持创建并返回指定Module中的internal类型的实例;

以非泛型方式调用泛型方法的意义在前文中已经讨论过了,对很多支持泛型方法的框架来说,是非常必要的代替反射的功能(相比反射性能提升3-4个数量级)。

那么访问internal类型和方法有什么意义呢?除了突破原来的CLR的不能跨程序集访问internal成员的限制这个明显的好处之外,更大的意义在于我们可以使用.Net Framework提供的很多非常有用的internal组件,这些组件,MS出于各种原因标记为了internal,但是,既然提供了,我们就有理由去使用它,对于实现我们自己的组件时充分利用.Net Framework内置的这些组件而减少我们重复劳动的工作量也很有意义。


使用演示:

 1源码发布 - DynamicMethodProxyFactory组件using System;
 2源码发布 - DynamicMethodProxyFactory组件using System.Collections.Generic;
 3源码发布 - DynamicMethodProxyFactory组件using System.Reflection;
 4源码发布 - DynamicMethodProxyFactory组件using System.Reflection.Emit;
 5源码发布 - DynamicMethodProxyFactory组件using System.Text;
 6源码发布 - DynamicMethodProxyFactory组件
 7源码发布 - DynamicMethodProxyFactory组件namespace DynamicMethodProxyTest
 8}


下载测试代码和类库源码

相关文章:

  • 2021-08-06
  • 2022-12-23
  • 2022-12-23
  • 2022-02-09
  • 2021-11-29
  • 2022-12-23
  • 2022-12-23
  • 2021-06-08
猜你喜欢
  • 2021-06-09
  • 2022-12-23
  • 2021-09-23
  • 2021-08-30
  • 2021-09-04
  • 2021-11-04
  • 2021-09-21
相关资源
相似解决方案