web-dev-qa-db-ja.com

型が匿名かどうかをテストする方法は?

オブジェクトをHTMLタグにシリアル化する次のメソッドがあります。タイプがAnonymousでない場合のみ、これを実行します。

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
    }
}

誰かがこれを達成する方法を教えてもらえますか?

ありがとう

66
DaveDev

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.HasFlag(TypeAttributes.NotPublic);
}

編集:
拡張メソッドを使用した別のリンク: タイプが匿名タイプであるかどうかの判別

61
Sunny

素早く汚い:

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

名前空間がnullかどうかを確認するだけです。

public static bool IsAnonymousType(this object instance)
{

    if (instance==null)
        return false;

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

さて、今日のcompiierは、ジェネリックANDシールクラスとして匿名型を生成します。ジェネリッククラスの特殊化は継承の一種であるため、逆説的な組み合わせではないでしょうか。これを確認できます:1.これはジェネリック型ですか?はい=> 2)その定義は封印されており、公開されていませんか?はい=> 3)その定義にCompilerGeneratedAttribute属性がありますか?これら3つの基準が一緒に当てはまる場合、私たちは匿名型を持っていると思います...ええと...記述されているメソッドのいずれかに問題があります-それらは.NETの次のバージョンで変更される可能性がある使用面であり、そのため、MicrosoftがIsAnonymousブールプロパティをTypeクラスに追加するまでは。私たち全員が死ぬ前にそれが起こることを願っています...その日まで、それは次のようにチェックすることができます:

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());
    }
}
7

CompilerGeneratedAttributeおよびDebuggerDisplayAttribute.Typeを確認します

これは、匿名型のためにコンパイラによって生成されたコードです

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