1

タイプに[DataContract]属性が定義されているか、または定義されているタイプを継承しているかどうかを確認しようとしています

例えば:

[DataContract]
public class Base
{
}


public class Child : Base
{
}

// IsDefined(typeof(Child), typeof(DataContract)) should be true;

Attribute.IsDefined、およびAttribute.GetCustomAttributeは基本クラスを参照しません

BaseClassesを見ずにこれを行う方法を誰もが知っています

4

2 に答える 2

5

継承されたクラスで検索を実行するかどうかをbool値で受け取るメソッドGetCustomAttribute()とメソッドにオーバーロードがあります。GetCustomAttributes(bool inherit)ただし、検索している属性がその属性で定義されている場合にのみ機能し[AttributeUsage(AttributeTargets.?, Inherited = true)]ます。

于 2012-11-19T15:04:03.943 に答える
1

これを試して

public static bool IsDefined(Type t, Type attrType)
{
    do {
        if (t.GetCustomAttributes(attrType, true).Length > 0) {
            return true;
        }
        t = t.BaseType;
    } while (t != null);
    return false;
}

コメントに「再帰」という用語が含まれているため、再帰呼び出しで作成することを思いつきました。これが拡張メソッドです

public static bool IsDefined(this Type t, Type attrType)
{
    if (t == null) {
        return false;
    }
    return 
        t.GetCustomAttributes(attrType, true).Length > 0 ||
        t.BaseType.IsDefined(attrType);
}

このように呼んでください

typeof(Child).IsDefined(typeof(DataContractAttribute))
于 2012-11-19T15:20:52.733 に答える