दिलचस्प पोस्ट
XMLHttpRequest https: // www लोड नहीं कर सकता। .com / एस्पनेट एमवीसी 4 में कुकी का उपयोग करना लोचदार खोज – अनसाइन किए गए shards के साथ क्या करना है एएसपी.नेट एमवीसी रूपों में चेकबॉक्स को कैसे नियंत्रित किया जाए? स्विंग जेकॉम्नेन्ट्स में अंश का रेंडरिंग कैसे करें क्या जेडीबीसी के साथ चिंगारी की पुशनिधि पुशडाइन काम करता है? डिवी के अंदर की सीमा रखते हुए और इसके किनारे पर नहीं कोण के रूप में तारीख को स्वरूपित करने के लिए मैं चेतावनी से उत्पन्न पृष्ठ से "पाठ" कैसे प्राप्त करूं, ** के बाद ** मानव उपयोगकर्ता ने पृष्ठ के ** चेतावनी ** पर * खारिज कर दिया है? मैं कैसे एक एंड्रॉइड डिवाइस पर एक एसडी कार्ड घुड़सवार मुक्त अंतरिक्ष पूछ सकते हैं? पिकासो में अमान्य कैश जावा के लिए आराम ग्राहकों? मैं जावा में मेरे स्वैप समारोह कैसे कर सकता हूं? कैसे एक WordPress शोर्ट में AJAX का उपयोग करें? स्कला में अंडरस्कोर के सभी उपयोग क्या हैं?

सी # कैसे एक घटना को झुका हुआ है खोजने के लिए

मैं यह जानना चाहता हूं कि कोई इवेंट जुड़ा हुआ है या नहीं। मैंने चारों ओर देखा है, लेकिन मुझे केवल ऐसे समाधान मिल चुके हैं, जिसमें घटना के अंदरूनी तत्वों को संशोधित करना शामिल है मैं ऐसा नहीं करना चाहता।

यहाँ कुछ परीक्षण कोड है जो मैंने सोचा था कि काम करेगा:

// Create a new event handler that takes in the function I want to execute when the event fires EventHandler myEventHandler = new EventHandler(myObject_SomeEvent); // Get "p1" number events that got hooked up to myEventHandler int p1 = myEventHandler.GetInvocationList().Length; // Now actually hook an event up myObject.SomeEvent += m_myEventHandler; // Re check "p2" number of events hooked up to myEventHandler int p2 = myEventHandler.GetInvocationList().Length; 

इसके बाद के मसले गलत मरे हुए हैं। मैंने सोचा कि किसी तरह मेरे ईवेंटहैंडलर में "invocationList" स्वचालित रूप से अद्यतन हो जाएगा जब मैंने इसे किसी इवेंट को जोड़ा। लेकिन नहीं, यह मामला नहीं है। इसकी लंबाई हमेशा एक के रूप में वापस आती है

क्या उस वस्तु को बाहर से निर्धारित करने के लिए वैसे भी कोई घटना है जिसमें इवेंट शामिल है?

वेब के समाधान से एकत्रित समाधान "सी # कैसे एक घटना को झुका हुआ है खोजने के लिए"

सी # event कीवर्ड द्वारा प्रस्तुत एक भ्रामक भ्रम है और यह कि एक घटना में एक आवेश सूची है

यदि आप सी # event कीवर्ड का उपयोग करते हुए घटना को घोषित करते हैं, तो कंपाइलर आपकी कक्षा में एक निजी प्रतिनिधि बनाएगा, और इसे आपके लिए प्रबंधित करेगा। जब भी आप ईवेंट की सदस्यता लेंगे, तो संकलक-जनरेटेड add विधि लागू की जाती है, जो ईवेंट के हैंडलर को प्रतिनिधि की इनवॉइस सूची में add है। ईवेंट के लिए कोई स्पष्ट आवाज़ सूची नहीं है

इस प्रकार, प्रतिनिधि का आमंत्रण सूची प्राप्त करने का एकमात्र तरीका अधिमानतः है:

  • कंपाइलर-जनरेटेड प्रतिनिधि तक पहुंचने के लिए प्रतिबिंब का उपयोग करें या
  • एक गैर-निजी प्रतिनिधि (शायद आंतरिक) बनाएं और ईवेंट के मैन्युअल रूप से जोड़ें / निकालें तरीकों को कार्यान्वित करें (यह कंपाइलर को ईवेंट के डिफ़ॉल्ट कार्यान्वयन को उत्पन्न करने से रोकता है)

यह एक उदाहरण है जो बाद की तकनीक का प्रदर्शन करता है।

 class MyType { internal EventHandler<int> _delegate; public event EventHandler<int> MyEvent; { add { _delegate += value; } remove { _delegate -= value; } } } 

अगर संबंधित वस्तु ने ईवेंट कीवर्ड को निर्दिष्ट किया है, तो आप जो कुछ भी कर सकते हैं ( += ) जोड़ते हैं और ( -= ) हैंडलर्स को हटाते हैं, कुछ और नहीं

मुझे विश्वास है कि आविष्कार सूची की लंबाई की तुलना काम करेगी, लेकिन आपको इस पर प्राप्त होने के लिए ऑब्जेक्ट के अंदर काम करना होगा।

इसके अलावा, ध्यान रखें कि += और -= ऑपरेटर एक नई घटना वस्तु वापस करते हैं; वे मौजूदा एक को संशोधित नहीं करते हैं

आप क्यों जानना चाहते हैं कि किसी विशेष घटना को झुका है? क्या यह कई बार पंजीकरण करने से बचने के लिए है?

यदि हां, तो ट्रांस्लेट पहले हैंडलर को निकालने के लिए है ( -= ) एक हैंडलर निकालने के लिए जो कानूनी नहीं है, और कुछ भी नहीं करता है। उदाहरण के लिए:

 // Ensure we don't end up being triggered multiple times by the event myObject.KeyEvent -= KeyEventHandler; myObject.KeyEvent += KeyEventHandler; 

यह किया जा सकता है, लेकिन कुछ हैकिंग लेता है … जैसा कि ऊपर बताया गया है कि कंपाइलर इसके बैकिंग फ़ील्ड सहित ईवेंट के कार्यान्वयन को उत्पन्न करता है रिफ्लेक्शन आपको बैकिंग फ़ील्ड को नाम से पुनः प्राप्त करने देता है, और एक बार आपके पास इसे एक्सेस होने पर आप GetInvocationList() को कॉल कर सकते हैं, भले ही आप कक्षा से बाहर हों

चूंकि आप नाम से घटना प्राप्त करने के लिए प्रतिबिंब का उपयोग करने के लिए कह रहे हैं, मुझे लगता है कि आप नाम से प्रकार प्राप्त करने के लिए प्रतिबिंब का उपयोग कर रहे हैं – मैं एक उदाहरण को सजा रहा हूँ जो यह कैसे दिखाएगा कि यह कैसे करना है

 using System; using System.Collections.Generic; using System.ComponentModel; using System.Text; using System.Reflection; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { string typeName = "ConsoleApplication1.SomeClass, ConsoleApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"; string eventName = "SomeEvent"; Type declaringType = Type.GetType(typeName); object target = Activator.CreateInstance(declaringType); EventHandler eventDelegate; eventDelegate = GetEventHandler(target, eventName); if (eventDelegate == null) { Console.WriteLine("No listeners"); } // attach a listener SomeClass bleh = (SomeClass)target; bleh.SomeEvent += delegate { }; // eventDelegate = GetEventHandler(target, eventName); if (eventDelegate == null) { Console.WriteLine("No listeners"); } else { Console.WriteLine("Listeners: " + eventDelegate.GetInvocationList().Length); } Console.ReadKey(); } static EventHandler GetEventHandler(object classInstance, string eventName) { Type classType = classInstance.GetType(); FieldInfo eventField = classType.GetField(eventName, BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Instance); EventHandler eventDelegate = (EventHandler)eventField.GetValue(classInstance); // eventDelegate will be null if no listeners are attached to the event if (eventDelegate == null) { return null; } return eventDelegate; } } class SomeClass { public event EventHandler SomeEvent; } } 

आपको "ईवेंट" के माध्यम से इनवोकेशन सूची प्राप्त करने में सक्षम होना चाहिए। मोटे तौर पर, यह कुछ ऐसा होगा ..

 public delegate void MyHandler; public event MyHandler _MyEvent public int GetInvocationListLength() { var d = this._MyEvent.GetInvocationList(); //Delegate[] return d.Length; }