2017-01-23 2 views
7

Ci-dessous j'ai une solution pour obtenir des attributs de champs avec une méthode d'extension. Maintenant, je veux faire une chose similaire avec des méthodes au lieu de champs.Accès aux attributs sur les méthodes utilisant la méthode d'extension

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; 
} 

Utilisation:

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

Donc, dans mon cas, l'utilisation devrait ressembler à quelque chose comme ceci:

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

Est-ce possible de quelque façon ou dois-je essayer quelque chose de complètement différent ?

+0

Vous recevez des erreurs? On ne sait pas ce que vous demandez. La même chose devrait s'appliquer à MethodInfo – Nkosi

+0

@Nkosi Non le code ci-dessus fonctionne, mais je veux faire la même chose avec des méthodes au lieu de champs. –

Répondre

6

Vous pouvez effectuer les opérations suivantes:

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; 
} 

Notez que vous devez gérer void méthodes différemment parce que Func<T, R> n'a pas de sens, vous avez besoin d'une surcharge avec Action<T>.

+0

Merci cela a fonctionné! –

+0

@HansDabi vous êtes les bienvenus! – InBetween