2011-06-09 21 views
11

क्या यह पता लगाना संभव है कि घटना में कोई श्रोताओं है या नहीं? (मुझे किसी भी व्यक्ति को इसकी आवश्यकता होने पर, मेरे ईवेंट प्रदाता ऑब्जेक्ट को निपटाने की आवश्यकता है)जांचें कि ईवेंट में कोई श्रोताओं है या नहीं?

+0

मेरा संपादन देखें ..... –

उत्तर

19

मान लें वर्ग एक 3 पार्टी पुस्तकालय में है और यह कर सकते हैं:

संपादित
जब से तुम TheEvent वर्ग के बाहर से उपयोग नहीं कर सकते, तो आप एक विधि है कि जांच करता है को लागू कर सकता है 'टी संशोधित किया जा:

public class Data 
    { 
     public event EventHandler OnSave; 
     //other members 
    } 

अपने कार्यक्रम में:

Data d = new Data(); 
    d.OnSave += delegate { Console.WriteLine("event"); }; 
    var handler = typeof(Data).GetField("OnSave", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(d) as Delegate; 

    if (handler == null) 
    { 
     //no subscribers 
    } 
    else 
    { 
     var subscribers = handler.GetInvocationList(); 
     //now you have the subscribers 
    } 
+0

को सही किया है ऐसा लगता है कि GetInvocationList को वास्तव में जरूरी नहीं है, नल के लिए हैंडलर की जांच पर्याप्त है। क्या मैं सही हूँ? – user626528

+0

@ user626528: हाँ आप सही हैं। इस उदाहरण में मैं कुछ ऐसा दिखा रहा हूं जो कुछ मामलों में उपयोगी हो। –

+2

यदि कोई ऑनसेव ईवेंट नहीं जोड़े जाने पर हैंडलर शून्य हो जाएगा, तो ऊपर दिए गए कोड में शून्य जांच होनी चाहिए या फिर त्रुटि होगी। – Justin

4

आप जांच सकते हैं कि ईवेंट है या नहीं! = Null।

वैसे, में सी # आप इस के लिए हर बार की जाँच की जरूरत है आप एक घटना बढ़ा:

if (TheEvent != null) { 
    TheEvent(this, e); 
} 

और कारण वास्तव में है अगर घटना किसी भी श्रोता की जांच करने के लिए।

public class TheClass { 
    public bool HasEventListeners() { 
     return TheEvent != null; 
    } 
} 
+0

मुझे इसे ऑब्जेक्ट के बाहर जांचना होगा, क्योंकि यह तीसरी पार्टी द्वारा बनाई गई है। मुझे यह जांचने की ज़रूरत है कि कोई ऑब्जेक्ट की घटना के लिए सदस्यता लेता है, और यदि कोई सब्सक्रिप्शन नहीं है तो इसका निपटान करें। – user626528

+0

मुझे नहीं लगता कि आप कर सकते हैं, आपको एक विधि रैपर – Simone

+0

संपादित उत्तर देखने की आवश्यकता है। – Simone

0
void Main() 
{ 
    Console.WriteLine(ContainsOnSomethingEvent()); // false 
    OnSomething += (o,e) => {}; 
    Console.WriteLine(ContainsOnSomethingEvent()); // true 
} 
EventHandler mOnSomething; 

event EventHandler OnSomething { 
    add { mOnSomething = (EventHandler)EventHandler.Combine(mOnSomething, value); } 
    remove { mOnSomething = (EventHandler)EventHandler.Remove(mOnSomething, value); } 
} 

public bool ContainsOnSomethingEvent() { 
    return mOnSomething != null && mOnSomething.GetInvocationList().Length > 0; 
} 
संबंधित मुद्दे