Как проверить, является ли тип анонимным? [дубликат]


этот вопрос уже есть ответ здесь:

  • Анонимные типы-есть ли какие-либо характеристики distingushing? 3 ответы

У меня есть следующий метод, который сериализует объект в HTML-тег. Я только хочу сделать это, хотя, если тип не является анонимным.

private void MergeTypeDataToTag(object typeData)
{
    if (typeData != null)
    {
        Type elementType = typeData.GetType();

        if (/* elementType != AnonymousType */)
        {
            _tag.Attributes.Add("class", elementType.Name);    
        }

        // do some more stuff
    }
}

может кто-нибудь показать мне, как добиться это?

спасибо

5 54

5 ответов:

от:http://www.liensberger.it/web/blog/?p=191

private static bool CheckIfAnonymousType(Type type)
{
    if (type == null)
        throw new ArgumentNullException("type");

    // HACK: The only way to detect anonymous types right now.
    return Attribute.IsDefined(type, typeof(CompilerGeneratedAttribute), false)
        && type.IsGenericType && type.Name.Contains("AnonymousType")
        && (type.Name.StartsWith("<>") || type.Name.StartsWith("VB$"))
        && (type.Attributes & TypeAttributes.NotPublic) == TypeAttributes.NotPublic;
}

HTH.

EDIT:
Еще одна ссылка с методом расширения: определение того, является ли тип анонимным типом

быстро и грязно:

if(obj.GetType().Name.Contains("AnonymousType"))

вы можете просто проверить, является ли пространство имен null.

public static bool IsAnonymousType(this object instance)
{

    if (instance==null)
        return false;

    return instance.GetType().Namespace == null;
}

ну, сегодня compiier генерирует анонимные типы как универсальные и запечатанные классы. Парадоксальная комбинация, поскольку специализация универсального класса является своего рода наследованием, не так ли? Так что вы можете проверить это: 1. Это универсальный тип? Да = > 2) является ли его определение запечатанным и не публичным? Да = > 3)имеет ли его определение атрибут CompilerGeneratedAttribute? Я думаю, если эти 3 условия выполняются вместе, у нас есть анонимный тип... Что ж... Существует проблема с любым из описанных методов - они используют аспекты, которые могут измениться в следующих версиях .NET, и это будет так, пока Microsoft не добавит свойство isanonymous boolean для типа class. Надеюсь, это случится до того, как мы все умрем... До этого дня он может быть проверен следующим образом:

using System.Runtime.CompilerServices;
using System.Reflection;

public static class AnonymousTypesSupport
{
    public static bool IsAnonymous(this Type type)
    {
        if (type.IsGenericType)
        {
            var d = type.GetGenericTypeDefinition();
            if (d.IsClass && d.IsSealed && d.Attributes.HasFlag(TypeAttributes.NotPublic))
            {
                var attributes = d.GetCustomAttributes(typeof(CompilerGeneratedAttribute), false);
                if (attributes != null && attributes.Length > 0)
                {
                    //WOW! We have an anonymous type!!!
                    return true;
                }
            }
        }
        return false;
    }

    public static bool IsAnonymousType<T>(this T instance)
    {
        return IsAnonymous(instance.GetType());
    }
}

проверить CompilerGeneratedAttribute и DebuggerDisplayAttribute.Type

вот код, сгенерированный компилятором для аномального типа

[CompilerGenerated, DebuggerDisplay(@"\{ a = {a} }", Type="<Anonymous Type>")]
internal sealed class <>f__AnonymousType0<<a>j__TPar>
{
...
}