2012-09-28 14 views
5

मेरे पास एक ही हस्ताक्षर है जिसमें ईवेंट का एक सेट है। अब मुझे आश्चर्य है कि क्या मैं सभी घटनाओं के लिए ऐसा करने के लिए एक सामान्य घटना हैंडलर उठाने की विधि बना सकता हूं?एक जेनेरिक इवेंट राइजिंग विधि कैसे बनाएं

  • क्या यह घटना <T> के रूप में एक ईवेंट भेजने के लिए संभव है?

उत्तर

10

यदि यह सभी एक ही वर्ग के भीतर है, तो आप एक विधि बना सकते हैं घटना है जो साथ काम करता है बढ़ाने के लिए उनमे से कोई भी। उदाहरण के लिए, यदि आपके घटनाओं सभी EventHandler<T> थे, तो आप इस्तेमाल कर सकते हैं:

private void RaiseEvent<T>(EventHandler<T> eventHandler, T eventArgs) 
{ 
    if (eventHandler != null) 
    { 
     eventHandler(this, eventArgs); 
    } 
} 

फिर आप के माध्यम से इस कह सकते हैं: रीड Copsey के उत्तर की एक स्थिर संस्करण के लिए

this.RaiseEvent(this.MyEvent, new MyEventArgs("Foo")); 
+0

इस विवर्तन के साथ, दौड़ की स्थिति से बचने के लिए शून्य की जांच करने से पहले स्थानीय चर में हैंडलर रखने की कोई ज़रूरत है? –

+0

@ mohsen.d कोई दौड़ की स्थिति नहीं है। eventHandler एक पैरामीटर है। – CrazyCasta

+0

@ रीड कॉपसे क्षमा करें, लेकिन क्या आप थोड़ा और समझा सकते हैं? धन्यवाद –

-1

this देखें। यह वर्णन करता है कि आप क्या चाहते हैं।

आप कर सकते हैं एक टाइप किया प्रतिनिधि का उपयोग करते हुए और का उपयोग कर कि आपके घटना के लिए द्वारा एक टाइप किया ईवेंट बनाने:

public delegate void myDel<T>(T stuff); 

public event myDel<int> myEvent; 

public doStuff() 
{ 
    myDel(1); 
} 
+1

न केवल कि क्या ओ पी चाहता है ऐसा करने के लिए प्रतीत नहीं, ऐसा नहीं उचित अतः * बस * एक लिंक पोस्ट करने के लिए पर, भले ही वह इस सवाल का जवाब करता है। [अधिक जानकारी] (http://meta.stackexchange.com/questions/94022/how-can-i-link-to-an-external-resource-in-a-community-friendly-way) – Servy

1

, मैं एक स्थिर श्रेणी का निर्माण Event :

public static class Event 
{ 
    public static bool Raise<T>(Object source, EventHandler<T> eventHandler, T eventArgs) where T : EventArgs 
    { 
     EventHandler<T> handler = eventHandler; 
     if (handler != null) 
     { 
      handler(source, eventArgs); 
      return true; 
     } 
     return false; 
    } 
} 

यह भी मान लिया अपने ईवेंट हैंडलर्स प्रकार EventHandler<T> के हैं। वापसी का प्रकार void से bool से बदल दिया गया था और यह लौटाता है कि घटना के कोई श्रोताओं थे या नहीं। शायद ही कभी इस्तेमाल किया गया, तो void पर वापस बदलने के लिए स्वतंत्र महसूस करें।

उदाहरण उपयोग:

public event EventHandler<FooArgs> FooHappend; 

public void Foo() 
{ 
    Event.Raise(this, FooHappend, new FooArgs("Hello World!"); 
} 
संबंधित मुद्दे