2017-01-23 13 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

आप निम्न कर सकते हैं:

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

ध्यान दें कि आप अलग void तरीकों को संभालने के लिए क्योंकि Func<T, R> कोई मतलब नहीं है की जरूरत है, तो आप Action<T> साथ एक अधिभार की जरूरत है।

+0

धन्यवाद यह काम किया! –

+0

@ हंसडिबी आपका स्वागत है! – InBetween

संबंधित मुद्दे