确定.NET类型是否是动态的(使用Reflection.Emit创建)

时间:2010-04-23 16:45:15

标签: c# reflection .net-3.5

虽然.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;

1 个答案:

答案 0 :(得分:4)

如果程序集是使用Emit生成的,那么应该能够通过检查类型的程序集是AssemblyBuilder来验证这一点。换句话说,就像这样:

static Type GetNonEmittedType(Type t)
{
    if (t.Assembly is AssemblyBuilder)
        return GetNonEmittedType(t.BaseType);
    return t;
}

这可能对每种动态代理都不起作用 - 它实际上取决于它是如何生成的。但它适用于Emit