Определение, является ли тип .NET динамическим (создается с использованием Reflection.Emit). - PullRequest
2 голосов
/ 23 апреля 2010

Хотя платформа .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 Ответ

4 голосов
/ 23 апреля 2010

Если сборка была сгенерирована с использованием Emit, тогда вы должны убедиться в этом, проверив, является ли сборка типа AssemblyBuilder. Другими словами, примерно так:

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

Это может не сработать для каждого вида динамического прокси - это действительно зависит от того, как он был сгенерирован. Но это работает с Emit.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...