7

プロパティで見つかった場合に属性のインスタンスを返すメソッドを作成しました。

public static U GetPropertyAttribute<T, TProperty, U>(this T instance, Expression<Func<T, TProperty>> propertySelector, U attribute) where U : Attribute
{
   return Attribute.GetCustomAttribute(instance.GetType().GetProperty((propertySelector.Body as MemberExpression).Member.Name), typeof(U), true) as U;
}

インスタンスを取得するには、次を呼び出す必要があります。

var cc = new CustomClass();
cc.GetPropertyAttribute(x => x.Name, new NullableAttribute())

そしてそれはうまく機能します、私は属性クラスの正確なインスタンスを取得します。

ただし、新しいNullableAttribute()をパラメーターとして使用する必要があるのは気に入らないので、invokeを次のようにしたいと思います。

cc.GetPropertyAttribute<NullableAttribute>(x => x.Name)

ただし、2番目のパラメーターを削除し、メソッド名に1つのジェネリック型を追加するとすぐに、他の2つのジェネリック型も必要になるため、これは機能しません。メソッドに3つの一般的なパラメーターのうち2つを推測させる方法はありますか?つまり、属性クラスを指定したいのですが、クラス名とプロパティ名を指定したくありません。

アップデート:

これが、Jonのおかげで実装されたコードと、文字列ソリューションのコードです。他のいくつかの拡張クラスに同じアプローチを導入した場合に名前空間を汚さないように、クラスをネストすることにしました。

public static class AttributeExtensions
{
    public static ObjectProperty<T, TProperty> From<T, TProperty>(this T instance, Expression<Func<T, TProperty>> propertySelector)
    {
        return new ObjectProperty<T, TProperty>(instance, propertySelector);
    }

    public class ObjectProperty<T, TProperty>
    {
        private readonly T instance;
        private readonly Expression<Func<T, TProperty>> propertySelector;

        public ObjectProperty(T instance, Expression<Func<T, TProperty>> propertySelector)
        {
            this.instance = instance;
            this.propertySelector = propertySelector;
        }

        public U GetAttribute<U>() where U : Attribute
        {
            return Attribute.GetCustomAttribute(instance.GetType().GetProperty((propertySelector.Body as MemberExpression).Member.Name), typeof(U), true) as U;
        }
    }

    public static T GetPropertyAttribute<T>(this object instance, string propertyName) where T : Attribute
    {
        return Attribute.GetCustomAttribute(instance.GetType().GetProperty(propertyName), typeof(T), true) as T;
    }
}

したがって、invokeは次のようになります。

var cc = new CustomClass();
var attr = cc.From(x => x.Name).GetAttribute<NullableAttribute>();
4

1 に答える 1

8

メソッドに3つの一般的なパラメーターのうち2つを推測させる方法はありますか?

一般的なアプローチの1つは、これら2つの型パラメーターを持つ中間型を用意し、その型内にジェネリックメソッドを使用して、最後の型を指定できるようにすることです。

public static AttributeFetcher<T, TProperty> FetchFrom<T, TProperty>
    (this T instance, Expression<Func<T, TProperty>> propertySelector)
{
    return new AttributeFetcher<T, TProperty>(instance, propertySelector);     
}

public class AttributeFetcher<T, TProperty>
{
    private readonly T instance;
    private readonly Expression<Func<T, TProperty>> propertySelector;

    // Add obvious constructor

    public U Attribute<U>() where U : Attribute
    {
        // Code as before
    }
}

次に、次のように書くことができます。

cc.FetchFrom(x => x.Name).Attribute<NullableAttribte>();

私が知る限りAttributeFetcher、本当に必要なのはあなただけであることを考えると、実際に非ジェネリックにすることができる可能性があります。PropertyInfo上記のコードは、より一般的な場合のものです。

于 2012-10-25T16:48:37.577 に答える