C# 确定.NET类型是否是动态的(使用Reflection.Emit创建)
虽然.NET4框架提供了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
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的(代理)。实际上,我感兴趣的不是类型,而是类型名。