2017-01-23 27 views
7

以下は、拡張メソッドを持つフィールドから属性を取得するソリューションです。今ではフィールドの代わりにメソッドで同様のことをしたいと思います。拡張メソッドを使用してメソッドの属性にアクセスする

public static MemberInfo GetMember<T, R>(this T instance, Expression<Func<T, R>> selector) 
{ 
    var member = selector.Body as MemberExpression; 
    return member?.Member; 
} 

public static T GetAttribute<T>(this MemberInfo meminfo) where T : Attribute 
{ 
    return meminfo.GetCustomAttributes(typeof(T)).FirstOrDefault() as T; 
} 

使用法:

var attr = this.GetMember(x => x.AddButtonVisibility).GetAttribute<Test>(); 

だから私の場合には使用量が次のようになります。

var attr = this.GetMethod(x => x.SomeMethod).GetAttribute<Test>(); 

は、どのような方法で可能これですか、私は完全に異なる何かを試してみてください?

+0

エラーが表示されますか?あなたが求めていることは不明ですか?同じことがMethodInfoに適用されるはずです – Nkosi

+0

@Nkosi上記のコードは動作しませんが、フィールドの代わりにメソッドで同じことをしたいのです。 –

答えて

6

あなたは、次の操作を行うことができます:Func<T, R>は意味がありませんので、あなたがAction<T>と過負荷を必要とするあなたは異なっvoidメソッドを処理する必要が

public static MethodInfo GetMethod<T>(this T instance, Expression<Action<T>> selector) 
{ 
    var member = selector.Body as MethodCallExpression; 
    return member?.Method; 
} 

public static MethodInfo GetMethod<T, R>(this T instance, Expression<Func<T, R>> selector) 
{ 
    var member = selector.Body as MethodCallExpression; 
    return member?.Method; 
} 

注意を。

+0

ありがとうございました! –

+0

@ハンスダビあなたは大歓迎です! – InBetween

関連する問題