【问题标题】:Determining if a .NET type is dynamic (created using Reflection.Emit)确定 .NET 类型是否是动态的(使用 Reflection.Emit 创建)
【发布时间】:2011-02-11 14:56:58
【问题描述】:

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

【问题讨论】:

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

标签: c# reflection .net-3.5


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-03
    • 2015-08-08
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 2012-03-04
    • 1970-01-01
    相关资源
    最近更新 更多