带有自定义参数的C#事件

Ken*_*130 39 c# events

我想要一个仅将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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Che*_*hen 63

EventHandlerEventArgs作为参数接收.要解决您的问题,您可以构建自己的问题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 });
     } 
 } 
Run Code Online (Sandbox Code Playgroud)

  • @Prokurors前者是"更好",因为它可以避免声明一个委托,它实际上是`EventHandler <T>`的副本. (4认同)

Guf*_*ffa 24

您为参数声明了一个委托:

public enum MyEvents { Event1 }

public delegate void MyEventHandler(MyEvents e);

public static event MyEventHandler EventTriggered;
Run Code Online (Sandbox Code Playgroud)

虽然框架中的所有事件都采用了或来自的参数EventArgs,但您可以使用您喜欢的任何参数.但是,人们可能会期望框架中使用的模式,这可能会使您的代码更难以遵循.

  • 您可以将其缩短为`public static event Action <MyEvents> EventTriggered;` (10认同)

Ste*_*her 12

我可能会在游戏中迟到,但如何:

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

private void Trigger(MyEvent e) 
{ 
     EventTriggered(e);
} 
Run Code Online (Sandbox Code Playgroud)

将事件设置为匿名委托可以避免我检查事件是否为空.

我发现这在使用MVVM时很方便,就像使用ICommand.CanExecute方法一样.


Hog*_*gan 5

您需要声明自定义事件处理程序.

public class MyEventArgs: EventArgs
{
  ...
}

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

public class MyControl: UserControl
{
  public event MyEventHandler MyEvent;
   ...
}
Run Code Online (Sandbox Code Playgroud)