2017-01-23 44 views
7

Aşağıda Bir uzantı yöntemiyle alanlardan öznitelik almak için bir çözüm var. Şimdi alanlar yerine yöntemlerle benzer bir şey yapmak istiyorum.Uzantı yöntemini kullanarak yöntemlere öznitelikleri erişme

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

Kullanımı:

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

Yani benim durumumda kullanımı bu gibi görünmelidir:

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

hiçbir şekilde bu mümkün mü yoksa tamamen farklı bir şey denemek zorunda ?

+0

Herhangi bir hatayla karşılaşıyor musunuz? Ne sorduğun belli değil. Aynısı, MethodInfo – Nkosi

+0

@ Nkosi'ye uygulanmalıdır. Yukarıdaki kodlar yok, fakat aynı şeyi alan yerine yöntemler ile yapmak istiyorum. –

cevap

6

Aşağıdaki yapabilirsiniz: Eğer Func<T, R> hiçbir mantıklı nedeni farklı void yöntemleri ele gerekir

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

Not, sen Action<T> ile aşırı yüklenmeye gerek.

+0

Teşekkür ederim bu işe yaradı! –

+0

@HansDabi çok hoş geldiniz! – InBetween