虽然.NET 4框架提供了Assembly.IsDynamic
方法,但.NET 2.0 / 3.5却不是这样。
用例很简单:出于日志记录的目的,我想确定一个实体的基础类型名称,该实体可能被动态代理包装而没有对NHibernate或Castle有任何引用(知道关于代理人)
例如,我可能有CatProxYadaYada
,但我对Cat
感兴趣。
获得该类型的最简单方法是什么?我在想这个骨架:
var type = obj.GetType();
while (IsProxy_Dynamic_Whatever(obj))
type = type.BaseType;
return type;
答案 0 :(得分:4)
如果程序集是使用Emit
生成的,那么应该能够通过检查类型的程序集是AssemblyBuilder
来验证这一点。换句话说,就像这样:
static Type GetNonEmittedType(Type t)
{
if (t.Assembly is AssemblyBuilder)
return GetNonEmittedType(t.BaseType);
return t;
}
这可能对每种动态代理都不起作用 - 它实际上取决于它是如何生成的。但它适用于Emit
。