问题
在实际开发过程当中我们可能会针对某些类型使用动态代理技术(AOP),注入了一些拦截器进行处理,但是一旦某个类型被动态代理了,那么就会生成一个代理类。这个时候在该类内部使用 GetType()
方法获取到的 Type
类型并不是实际类型的 Type
,而是代理类的 Type
。
解决
那么我们如何在代理类当中获取到具体类型的 Type
呢?其实 Castle 给我们提供了一个工具类,叫做 ProxyUtil
,可以使用该工具类来获取到代理类所拦截的具体类型,下面的代码就是具体的使用方法。
DEMO 代码:
/// <summary>
/// 获得实例对象的真实类型
/// </summary>
/// <param name="instance">待获取类型的实例对象</param>
/// <returns>实例对象的真实类型</returns>
public static Type GetProxyClassRealType(this object instance)
{
Type realType;
if (ProxyUtil.IsProxy(instance))
{
realType = ProxyUtil.GetUnproxiedType(instance);
}
else
{
realType = instance.GetType();
}
return realType;
}