2017-01-23 15 views
7

Poniżej przedstawiono rozwiązanie pozwalające uzyskać atrybuty z pól przy użyciu metody rozszerzenia. Teraz chcę zrobić coś podobnego za pomocą metod zamiast pól.Uzyskiwanie dostępu do atrybutów metod przy użyciu metody rozszerzenia

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

Zastosowanie:

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

Więc w moim przypadku użycia powinna wyglądać mniej więcej tak:

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

Jest to możliwe w inny sposób albo muszę spróbować czegoś zupełnie innego ?

+0

Czy otrzymujesz jakieś błędy? Czy nie jest jasne, o co prosisz. To samo powinno odnosić się do MethodInfo – Nkosi

+0

@Nkosi Nie powyższy kod działa, ale chcę zrobić to samo z metodami zamiast z polami. –

Odpowiedz

6

można wykonać następujące czynności:

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

Należy pamiętać, że trzeba obsłużyć void metody różnie ponieważ Func<T, R> nie ma sensu, trzeba przeciążenie z Action<T>.

+0

Dziękuję, że to zadziałało! –

+0

@HansDabi jesteś bardzo mile widziany! – InBetween

Powiązane problemy