2010-09-18 56 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