2010-09-18 93 views
31

我想要一個僅將enum作爲參數的事件。例如帶自定義參數的C#事件

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 2010-09-18 14:59:14

+9

您可以將其縮短爲'public static event Action EventTriggered;' – 2010-09-18 15:29:35

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

事件EventHandler EventName(Your proposal)和public delegate void NewEventHandler(object sender,T e)之間的區別是什麼?公共事件NewEventHandler EventInstanceName;他們哪一個「更好」,爲什麼? – Prokurors 2014-09-13 23:02:16

+3

@Prokurors前者是「更好」的,因爲它可以讓你免於宣佈一個實際上是'EventHandler '副本的委託。 – 2014-09-23 08:30:01

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); 
} 

的情況下設置爲匿名委託避免了給我檢查,看看是否該事件不爲空。

我發現這在使用MVVM時非常方便,就像使用ICommand.CanExecute方法時一樣。

+0

使用現有類的絕妙示例。 – 2014-11-25 02:20:01