2017-01-23 4 views
7

Unten habe ich eine Lösung, um Attribute aus Feldern mit einer Erweiterungsmethode zu erhalten. Jetzt möchte ich eine ähnliche Sache mit Methoden anstelle von Feldern machen.Zugreifen auf Attribute für Methoden mit Erweiterungsmethode

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

Verbrauch:

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

Also in meinem Fall soll die Nutzung in etwa so aussehen:

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

Ist dies möglich, in irgendeiner Weise oder habe ich etwas ganz anderes versuchen, ?

+0

Erhalten Sie irgendwelche Fehler? Es ist unklar, was Sie fragen. Das gleiche sollte für MethodInfo gelten – Nkosi

+0

@Nkosi Nein der Code oben funktioniert, aber ich möchte das gleiche mit Methoden statt Felder zu tun. –

Antwort

6

Sie tun können, die folgenden:

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

Beachten Sie, dass void Methoden anders behandeln müssen, weil Func<T, R> keinen Sinn macht, müssen Sie eine Überlastung mit Action<T>.

+0

Danke, das hat funktioniert! –

+0

@HansDabi Sie sind herzlich willkommen! – InBetween

Verwandte Themen