2009-07-22 24 views
5

मैं एक साधारण गुण बना लिया है:मेरा .NET विशेषता कोई कार्रवाई क्यों नहीं करती है?

[AttributeUsage(AttributeTargets.Method)] 
public class InitAttribute : System.Attribute 
{ 
    public InitAttribute() 
    { 
     Console.WriteLine("Works!"); 
    } 
} 

और मैं इसे एक सरल विधि के लिए लागू होते हैं:

static class Logger 
{ 
    public static string _severity; 

    public static void Init(string severity) 
    { 
     _severity = severity; 
    } 

    [Init()] 
    public static void p() 
    { 
     Console.WriteLine(_severity); 
    } 
} 

क्या चल रहा है सुंदर streight से आगे है। केवल, मैं उम्मीद करता हूं कि एट्रिब्यूट एक एक्शन (प्रिंटिंग वर्क्स!) करने की उम्मीद है, लेकिन ऐसा नहीं होता है।

व्यसन, प्रिंटिंग "काम करता है!" निश्चित रूप से केवल डीबगिंग उद्देश्यों के लिए है: मैं इंस्टेंस की संपत्ति _severity (उदाहरण के लिए है, = null, उदाहरण के लिए) तक पहुंचना चाहता हूं, लेकिन सब कुछ जो मैं गुणों के बारे में पढ़ता रहता हूं (जो मेरे लिए बहुत नए हैं) कक्षा 'विधियों या गुणों और प्रतिबिंब के माध्यम से इतने पर पहुंचने के बारे में है। एक बार जब मैंने _severity का मूल्यांकन किया है, तो मैं सजाए गए तरीके के व्यवहार को कैसे संशोधित कर सकता हूं (इस मामले में, अपवाद बढ़ाएं "लॉगर प्रारंभ नहीं हुआ है" और इसे निष्पादित न करें)?

किसी भी मदद की सराहना की।

उत्तर

11

यदि आपको एक क्रिया करने के लिए एक क्रिया करने की आवश्यकता है, तो आपको aspect-oriented programming और PostSharp जैसे ढांचे को देखना चाहिए। गुण स्वयं द्वारा कुछ भी करने के लिए डिज़ाइन नहीं किए गए हैं। वे आईएल असेंबली में सामान से जुड़े डेटा (या मेटाडाटा अगर आप करेंगे) का एक गुच्छा है जिसे रनटाइम पर पूछताछ की जा सकती है।

+7

उपयोगकर्ताओं को इस सवाल से पूछने का एक तरीका यह है कि एएसपी.नेट एमवीसी जैसे ढांचे को एक्शनफिल्टरएट्रिब्यूट जैसी चीजों में विशेषताओं के लिए हुक जोड़ते हैं, ताकि वे कुछ करने लगे। यह लोगों को सामान्य गुणों को अधिक सक्रिय होने की कोशिश करने के लिए प्रोत्साहित करता है। –

1

विशेषताएँ केवल प्रकारों और सदस्यों की सजावट की अनुमति देती हैं, लेकिन विशेषता स्वयं सजाए गए ऑब्जेक्ट को स्वीकार नहीं कर सकती है। आपको विशेषता के भीतर काम करने के लिए आवश्यक किसी भी डेटा में पास करने के लिए विशेषता के कन्स्ट्रक्टर पैरामीटर का उपयोग करना होगा।

यदि आप अपने लक्षित ऑब्जेक्ट्स के व्यवहार को स्वचालित रूप से बदलने के लिए विशेषताओं का उपयोग करना चाहते हैं, तो आपको PostSharp जैसे एओपी समाधान देखना होगा।

1

विशेषता वास्तव में कभी भी तत्काल नहीं होती है और इसलिए इसके निर्माता को कभी नहीं कहा जाता है। जब तक आप इसे पुनर्प्राप्त करने के लिए प्रतिबिंब का उपयोग नहीं करते हैं तब तक विशेषता मेटा-डेटा के रूप में बनी हुई है। जैसा कि पहले बताया गया है कि आप एक आस्पेक्ट ओरिएंटेड प्रोग्रामिंग टूल के बाद क्या कर रहे हैं। PostSharp असेंबली को पोस्ट-बिल्ड चरण के रूप में बदलकर काम करता है। यदि आप Castle Windsor या Unity नियंत्रण कंटेनर का उलटा उपयोग कर रहे हैं तो वे दोनों एओपी क्षमताओं की भी पेशकश करते हैं।

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