2012-04-25 9 views
5

के माध्यम से ओवरराइड संपत्ति से विशेषता प्राप्त करना मैं किसी संपत्ति पर परिभाषित विशेषता प्राप्त करने के लिए GetCustomAttributes() का उपयोग करने का प्रयास कर रहा हूं। मुद्दा यह है कि संपत्ति एक ओवरराइड एक है और मैं अभिव्यक्ति से ओवरराइड किए गए निकालने का तरीका नहीं निकाल सकता। मैं केवल बेस क्लास के लिए कैसे काम कर सकता हूं।एक लिनक्स अभिव्यक्ति

यहाँ कुछ कोड

public class MyAttribute : Attribute 
{ 
    //... 
} 

public abstract class Text 
{ 
    public abstract string Content {get; set;} 
} 

public class Abstract : Text 
{ 
    [MyAttribute("Some Info")] 
    public override string Content {get; set;} 
} 

अब मैं MyAttribute सार वर्ग से बाहर निकलने की कोशिश कर रहा हूँ है। लेकिन मुझे इसे Expression के माध्यम से प्राप्त करने की आवश्यकता है। यह मैं क्या उपयोग किया गया है है:

Expression<Func<Abstract, string>> expression = c => c.Content; 
Expression exp = expression.Body; 
MemberInfo memberType = (exp as MemberExpression).Member; 

var attrs = Attribute.GetCustomAttributes(memberType, true); 

दुर्भाग्य atts के रूप में खाली समाप्त होता है। समस्या यह है कि menberTypeAbstract.Content कक्षा के बजाय Text.Content के लिए समाप्त होता है। तो जब मुझे गुण मिलते हैं, तो यह कुछ भी नहीं देता है।

उत्तर

3

यह काम नहीं कर रहा है क्योंकि MemberExpression ओवरराइड को अनदेखा करता है और संपत्ति को आधार प्रकार Text देता है, यही कारण है कि आपको अपनी विशेषता नहीं मिलती है।

आप इस समस्या के बारे में यहाँ पढ़ सकते हैं: How to get the child declaring type from an expression?

हालांकि आप अभिव्यक्ति में सभी जानकारी है और आप थोड़ा और प्रतिबिंब (त्वरित और गंदी नमूना) के साथ अपने गुण प्राप्त कर सकते हैं:

Expression<Func<Abstract, string>> expression = (Abstract c) => c.Content; 
Expression exp = expression.Body; 
MemberInfo memberType = (exp as MemberExpression).Member; 

var attrs = Attribute.GetCustomAttributes(
expression.Parameters[0].Type.GetProperty(memberType.Name)); 
+0

दूसरे प्रश्न के लिंक के लिए धन्यवाद। मैंने कुछ इसी तरह की खोज की लेकिन उसे वह नहीं मिला। – Jero

+0

आपके द्वारा दिया गया समाधान वह काम है जो अब तक उपयोग कर रहा है, उसके लिए कुछ स्वतंत्र समर्थन प्राप्त करने के लिए अब बहुत अच्छा है :-) धन्यवाद – Jero

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