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

C# 确定.NET类型是否是动态的(使用Reflection.Emit创建),c#,reflection,.net-3.5,C#,Reflection,.net 3.5,虽然.NET4框架提供了Assembly.IsDynamic方法,但.NET2.0/3.5并非如此 用例很简单:出于日志记录的目的,我想确定一个实体的基本类型名,该实体可能被动态代理包装,而不引用NHibernate或Castle(它们知道代理) 例如,我可能有一个CatProxYadaYada,但我对Cat感兴趣 最简单的方法是什么?我想到了这个骨架: var type = obj.GetType(); while (IsProxy_Dynamic_Whatever(obj)) type

虽然.NET4框架提供了
Assembly.IsDynamic
方法,但.NET2.0/3.5并非如此

用例很简单:出于日志记录的目的,我想确定一个实体的基本类型名,该实体可能被动态代理包装,而不引用NHibernate或Castle(它们知道代理)

例如,我可能有一个
CatProxYadaYada
,但我对
Cat
感兴趣

最简单的方法是什么?我想到了这个骨架:

var type = obj.GetType();
while (IsProxy_Dynamic_Whatever(obj))
  type = type.BaseType;
return type;

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

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

这可能不适用于所有类型的动态代理-它实际上取决于它是如何生成的。但是它与
Emit

一起工作,这打破了代理提供的抽象——其主要思想是消费者不应该知道/关心差异。你在做什么样的日志记录需要你知道这一点?@Aaronaught,我只想记录“Cat#324失败验证”之类的东西,将从我的实体类继承的对象传递给方法。也就是说,代码甚至不知道该实例是Cat的(代理)。实际上,我感兴趣的不是类型,而是类型名。