2011-07-25 11 views
12

मैंने इस एनोटेशन क्लास को
बनाया है यह उदाहरण समझ में नहीं आता है क्योंकि यह हमेशा एक अपवाद फेंक देगा लेकिन मैं अभी भी इसका उपयोग कर रहा हूं क्योंकि मैं बस यह समझाने की कोशिश कर रहा हूं कि मेरा प्रश्न क्या है। मेरी एनोटेशन किसी भी कारण से किसी भी समाधान के लिए कभी नहीं बुलाया जाता है?सी # - कस्टम एनोटेशन का उपयोग करना?

public class AuthenticationRequired : System.Attribute 
{ 
    public AuthenticationRequired() 
    { 
     // My break point never gets hit why? 
     throw new Exception("Throw this to see if annotation works or not"); 
    } 
} 

[AuthenticationRequired] 
private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    // My break point get here 
} 
+4

यहाँ की तरह आप तक पहुंचने और उसे पढ़ने के लिए अपने कस्टम एनोटेशन के लिए कैसे है कहना है /z919e8tw.aspx#Y109 –

उत्तर

22

मेरे एनोटेशन कुछ कारणों किसी भी समाधान के लिए कहा जाता है कभी नहीं हो जाता है?

यह गुणों की गलतफहमी है। गुण आपके कोड के कुछ हिस्सों (कक्षाओं, गुणों, फ़ील्ड, विधियों, पैरामीटर इत्यादि) में मेटाडेटा जोड़ने के लिए प्रभावी रूप से मौजूद हैं। कंपाइलर विशेषता में जानकारी लेता है और इसे आईएल में बनाता है जो आपके स्रोत को खाने के दौरान बाहर निकलता है कोड।

स्वयं द्वारा गुण कुछ भी नहीं करते हैं जब तक कि कोई उन्हें उपभोग न करे। यही है, किसी बिंदु पर किसी को आपकी विशेषता खोजनी है और फिर उस पर कार्रवाई करना है। वे आपकी असेंबली के आईएल में बैठते हैं, लेकिन जब तक कोई उन्हें नहीं ढूंढता और उन पर कार्य करता है तब तक वे कुछ भी नहीं करते हैं। यह केवल तब होता है जब वे ऐसा करते हैं तो विशेषता का एक उदाहरण तत्काल हो जाएगा। ऐसा करने का सामान्य तरीका प्रतिबिंब का उपयोग कर रहा है। http://msdn.microsoft.com/en-us/library:

कार्यावधि में गुण प्राप्त करने के लिए, आप कुछ

var attributes = typeof(Foo) 
        .GetMethod("Window_Loaded") 
        .GetCustomAttributes(typeof(AuthenticationRequired), true) 
        .Cast<AuthenticationRequired>(); 

foreach(var attribute in attributes) { 
    Console.WriteLine(attribute.ToString()); 
} 
+0

क्षमा करें अगर यह संकलित नहीं होता है, तो मेरे पास एक कंपाइलर आसान नहीं है। – jason

+0

उत्तर के लिए धन्यवाद, क्या यह संभव है कि जब कोई विधि एक विशिष्ट विशेषता है तो कोड के विशिष्ट ब्लॉक को बुलाया जाता है? क्या यह बुरा अभ्यास माना जाएगा? मान लीजिए कि मैं समय लॉग करने के लिए "लॉग" विशेषता के साथ हर विधि चाहता हूं। मैं कोड – aryaxt

+2

@aryaxt का पुन: उपयोग करने के लिए इस विधि का उपयोग करने का प्रयास कर रहा हूं: हां, ऐसा करना संभव है। लेकिन आपको इसे बनाने के लिए कुछ चाहिए (आप इसे स्वयं कर सकते हैं, लेकिन उपकरण उपलब्ध हैं जो आपके लिए यह करेंगे)। जो आप खोज रहे हैं वह कुछ ऐसा है जो आपके लिए गतिशील रूप से प्रॉक्सी बनाएगा। इन चिंताओं को अक्सर क्रॉस-कटिंग चिंताओं कहा जाता है, और इस प्रकार के प्रोग्रामिंग को पहलू उन्मुख प्रोग्रामिंग कहा जाता है। यदि आप कैसल विंडसर में अवरोध क्षमताओं को देखते हैं, उदाहरण के लिए, आप देखेंगे कि यह कैसे किया जा सकता है: http://www.castleproject.org/container/documentation/trunk/usersguide/interceptors.html – jason

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