2013-02-14 47 views
10

मेरे पास है:EventInfo.GetRaiseMethod() हमेशा अशक्त

event EventHandler MyEvent; 

MyEvent += new EventHandler(someHandler); 

if(this.GetEvent("MyEvent").GetRaiseMethod() == null) 
{ 
    // Always true... 
} 

लेकिन क्यों? एक हैंडलर जोड़ने के बाद, GetRaiseMethod()someHandler के MethodInfo पर सेट नहीं होना चाहिए?

उत्तर

9

यह सी # के एक मोड़ है, यह बढ़ाने accessors समर्थन नहीं करता। केवल जोड़ें और हटाएं। वीबी.नेट, एफ # और सी ++/सीएलआई जैसी अन्य .NET भाषाएं उनका समर्थन करती हैं और इसे सीएलआई स्पेक में अच्छी तरह परिभाषित किया गया है, जिसका नाम "आग" है।

यह समझाने के लिए क्यों सी # टीम यह छोड़ी कठिन है, मैं इसे कभी नहीं के लिए एक अच्छा विवरण देखा है। शुद्ध अटकलें: किसी भी सब्सक्राइब किए गए किसी ईवेंट के लिए ईवेंट तर्क बनाने की लागत से बचने के लिए उनकी इच्छा से कुछ करना पड़ सकता है। जीयूआई ढांचे में बहुत आम है। यह एक नुकसान का एक सा है, सी # प्रोग्रामर मानक मानक घटना पैटर्न लिखने के साथ-साथ एनआरई का निदान करते समय सैकड़ों हजार घंटे गुम हो गए थे जब वे शून्य की जांच करना भूल गए थे। एल्विस ऑपरेटर (?.) सी # वी 6 में अंततः इसे आसान बना दिया।

Anyhoo, आप कभी नहीं GetRaiseMethod से कुछ भी लेकिन अशक्त() यदि आप सी # में लिखे कोड को प्रतिबिंबित मिल जाएगा। हालांकि, जब आप VB.NET, F # या C++/CLI में लिखे गए थे तो आपको हमेशा एक गैर-शून्य मिल जाएगा। यदि आपको प्रतिबिंब के साथ ईवेंट को बढ़ाने की आवश्यकता है, तो आपको बैकिंग प्रतिनिधि चर को खोदना होगा, जो दर्दनाक हो सकता है। यदि स्वत: जेनरेट किए गए एक्सेस/निकालने वाले एक्सेसर्स का उपयोग किया गया था तो बैकिंग वैरिएबल के समान नाम होता है और आप इसे BindingFlags.NonPublic का उपयोग करके Type.GetField() के साथ पुनर्प्राप्त कर सकते हैं। BindingFlags.Instance।

+0

VB.NET साथ बहुत परिचित नहीं किया जा रहा है, मैं एक 'Event' के साथ कुछ VB.NET कोड लिखने का प्रयास किया, एक मामला ऐसा है कि' GetRaiseMethod() 'कुछ रिटर्न प्राप्त करने के लिए कोशिश कर रहा। मैंने 'एडहैंडलर' कथन की कोशिश की, लेकिन मैंने 'हैंडल' खंड भी कोशिश की। पूर्व केवल रन-टाइम पर घटना की सदस्यता लेता है (जैसे सी # में, मुझे लगता है?), लेकिन बाद में यह और अधिक आशाजनक लगता है कि यह संकलन समय पर संबंध घोषित करता है। फिर भी मुझे 'GetRaiseMethod' के साथ कोई सफलता नहीं मिली, यह' कुछ भी नहीं '(शून्य) देता है। मैं यह दिखाने के लिए एक उदाहरण कैसे बना सकता हूं कि 'GetRaiseMethod' VB.NET से आने वाले कोड के लिए गैर-तुच्छ हो सकता है? –

+0

जब मैं कोशिश करता हूं ठीक काम करता है, तो आपको इसके बारे में एक प्रश्न पूछना होगा। –

+0

ठीक है, मैंने एक नए धागे में एक प्रश्न पोस्ट किया। –

3

उठाने विधि accessors अलावा CLI विनिर्देश में उल्लेख करने के लिए "जोड़ें" और "निकालें" में से एक है - हालांकि, अधिकांश घटनाएँ अपने आप में यह सुविधा नहीं है। विशेष रूप से, सी # विशेष रूप से इसका समर्थन नहीं करता है - तो हाँ: वह हमेशा शून्य हो जाएगा।

+0

आप को जोड़ने के लिए है कि आप CLI विनिर्देश, नहीं सी # विनिर्देश के बारे में बात कर रहे हैं चाहते हो सकता है। – svick