プロパティで見つかった場合に属性のインスタンスを返すメソッドを作成しました。
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>();