0

特定のオブジェクトに特定の属性があるかどうかをチェックする拡張メソッドを作成しようとしています。

次の構文でチェックする例を見つけました。

private static bool IsMemberTested(MemberInfo member)
{
foreach (object attribute in member.GetCustomAttributes(true))
    {
        if (attribute is IsTestedAttribute)
        {
           return true;
        }
    }
return false;
}

今、私は次のことをしようとしています:

    public static bool HasAttribute<T>(this T instance, Type attribute)
    {
        return typeof(T).GetCustomAttributes(true).Any(x => x is attribute);
    }

ただし、「タイプまたは名前空間の「属性」がありません...」というメッセージが表示されます。

何が間違っていて、与えられた例とは異なります/どうすればこれを実現できますか?

編集:

ヒントをありがとう、私は今このようにそれを行うことができました:

    public static bool HasAttribute<T>(this T instance, Type attribute)
    {
        return typeof(T).GetCustomAttributes(attribute, true).Any();
    }

そして、属性のチェックは次のようになります。

var cc = new CustomClass();
var nullable = cc.HasAttribute(typeof(NullableAttribute));

助けてくれてありがとう。今、私は別の質問があります。クラスのプロパティ、文字列型のプロパティを属性で装飾し、後でそのプロパティに属性があるかどうかを確認したいとします。これは型でのみ機能するため、プロパティレベルで適用することはできません。プロパティチェックの解決策はありますか?

4

2 に答える 2

3

Type変数をis演算子の引数として使用することはできません。さらに、Anyオーバーロードがあるため、自分でこれをフィルタリングするために使用する必要はありGetCustomAttributesません。

私は同様の機能のためにこの拡張メソッドを書きました (私のものは、クラスに適用された単一の属性を返すことです):

    internal static AttributeType GetSingleAttribute<AttributeType>(this Type type) where AttributeType : Attribute
    {
        var a = type.GetCustomAttributes(typeof(AttributeType), true);
        return (AttributeType)a.SingleOrDefault();
    }

a != nullこれを変更して、探しているものを取得する代わりにブール値を返すことができます。

于 2012-10-25T12:20:58.537 に答える
0

単純なタイプでもプロパティ属性をチェックする方法についての解決策を作成しました:

    public static bool HasPropertyAttribute<T>(this T instance, string propertyName, Type attribute)
    {
        return Attribute.GetCustomAttributes(typeof(T).GetProperty(propertyName), attribute, true).Any();
    }

呼び出しは次のようになります。

var cc = new CustomClass();
cc.HasPropertyAttribute("Name", typeof(NullableAttribute));
于 2012-10-25T13:41:46.943 に答える