2010-09-18 18 views
31

मैं एक ऐसी घटना बनाना चाहता हूं जो केवल तर्क के रूप में enum लेता है। उदाहरण के लिएसी # घटना

public enum MyEvents{ 
    Event1 
} 

// how do I declare this to take enum MyEvents as argument 
public static event EventHandler EventTriggered; 

public static void Trigger(MyEvent event) 
{ 
    if (EventTriggered != null) 
    { 
     EventTriggered(event); 
    } 
} 

उत्तर

21

आप मापदंडों के लिए एक प्रतिनिधि की घोषणा:

public enum MyEvents { Event1 } 

public delegate void MyEventHandler(MyEvents e); 

public static event MyEventHandler EventTriggered; 

हालांकि ढांचे में सभी घटनाओं एक पैरामीटर है या EventArgs से निकला है कि लगता है, आप अपनी पसंद के किसी भी पैरामीटर का उपयोग कर सकते हैं। हालांकि, लोगों को ढांचे में इस्तेमाल पैटर्न की अपेक्षा करने की संभावना है, जो आपके कोड को पालन करने में कठोर बना सकता है।

+0

धन्यवाद यह वही है जो मैं ढूंढ रहा था। मैं आपकी टिप्पणी के साथ सहमत हूँ। – Kenoyer130

+9

आप इसे 'सार्वजनिक स्थैतिक ईवेंट एक्शन इवेंट ट्रिगर,' –

4

आपको एक कस्टम ईवेंटशैंडर घोषित करने की आवश्यकता है।

public class MyEventArgs: EventArgs 
{ 
    ... 
} 

public delegate void MyEventHandler(object sender, MyEventArgs e); 

public class MyControl: UserControl 
{ 
    public event MyEventHandler MyEvent; 
    ... 
} 
49

EventHandler एक पैरामीटर के रूप EventArgs प्राप्त करता है। अपनी समस्या को हल करने के लिए, आप अपना खुद का MyEventArgs बना सकते हैं।

public enum MyEvents 
{ 
    Event1 
} 

public class MyEventArgs : EventArgs 
{ 
    public MyEvents MyEvent { get; set; } 
} 

public static event EventHandler<MyEventArgs> EventTriggered; 

public static void Trigger(MyEvents ev) 
{ 
    if (EventTriggered != null) 
    { 
     EventTriggered(null, new MyEventArgs { MyEvent = ev }); 
    } 
} 
+0

इवेंट इवेंट हैंडलर इवेंटनाम (आपका प्रस्ताव) और सार्वजनिक प्रतिनिधि शून्य न्यूएवेंटहैंडलर (ऑब्जेक्ट प्रेषक, टी ई) के बीच क्या अंतर है; सार्वजनिक घटना NewEventHandler EventInstanceName; उनमें से कौन सा "बेहतर" है और क्यों? – Prokurors

+3

@ पूर्व में संरक्षक "बेहतर" हैं क्योंकि यह आपको एक प्रतिनिधि घोषित करने से बचाता है जो वास्तव में 'EventHandler ' का डुप्लिकेट है। –

0
public enum MyEvents 
{ 
    Event1 
} 

public class CustomEventArgs : EventArgs 
{ 
    public MyEvents MyEvents { get; set; } 
} 


private EventHandler<CustomEventArgs> onTrigger; 

public event EventHandler<CustomEventArgs> Trigger 
{ 
    add 
    { 
     onTrigger += value; 
    } 
    remove 
    { 
     onTrigger -= value; 
    } 
} 

protected void OnTrigger(CustomEventArgs e) 
{ 
    if (onTrigger != null) 
    { 
     onTrigger(this, e); 
    } 
} 
2

यहाँ अपने नमूना आप आरंभ करने के लिए के एक नए सिरे है।

  • अपने नमूना एक स्थिर घटना है - यह अधिक सामान्य है एक घटना एक वर्ग उदाहरण से आने के लिए, लेकिन मैं इसे नीचे स्थिर छोड़ दिया है।

  • नीचे दिया गया नमूना घटना को उठाए जाने वाले विधि के लिए अधिक मानक नामकरण OnXxx का भी उपयोग करता है।

  • नीचे दिया गया नमूना थ्रेड-सुरक्षा पर विचार नहीं करता है, जो कि यदि आप स्थिर होने पर जोर देते हैं तो यह अधिक समस्या हो सकती है।

public enum MyEvents{ 
    Event1 
} 

public class MyEventArgs : EventArgs 
{ 
    public MyEventArgs(MyEvents myEvents) 
    { 
     MyEvents = myEvents; 
    } 

    public MyEvents MyEvents { get; private set; } 
} 

public static class MyClass 
{ 
    public static event EventHandler<MyEventArgs> EventTriggered; 

    public static void Trigger(MyEvents myEvents) 
    { 
     OnMyEvent(new MyEventArgs(myEvents)); 
    } 

    protected static void OnMyEvent(MyEventArgs e) 
    { 
     if (EventTriggered != null) 
     { 
      // Normally the first argument (sender) is "this" - but your example 
      // uses a static event, so I'm passing null instead. 
      // EventTriggered(this, e); 
      EventTriggered(null, e); 
     } 
    } 
} 
12

मैं खेल में देर हो सकती है, लेकिन कैसे के बारे में:

public event Action<MyEvent> EventTriggered = delegate { }; 

private void Trigger(MyEvent e) 
{ 
    EventTriggered(e); 
} 

एक अनाम प्रतिनिधि को घटना की स्थापना से बचा जाता है मुझे अगर घटना रिक्त नहीं है देखने के लिए जाँच करने के लिए।

मुझे लगता है कि यह एमवीवीएम का उपयोग करते समय आसान है, जैसे ICOMand.CanExecute विधि का उपयोग करते समय।

+0

मौजूदा वर्गों का उपयोग करके शानदार उदाहरण के रूप में छोटा कर सकते हैं। –

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