【问题标题】:C# event with custom arguments带有自定义参数的 C# 事件
【发布时间】:2019-05-14 23:04:48
【问题描述】:

我想要一个仅将枚举作为参数的事件。例如

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

【问题讨论】:

    标签: c# events


    【解决方案1】:

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

    【讨论】:

    • event EventHandler EventName (Your proposal) 和 public delegate void NewEventHandler(object sender, T e); 有什么区别?公共事件 NewEventHandler EventInstanceName;其中哪一个“更好”,为什么?
    • @Prokurors 前者“更好”,因为它使您不必声明实际上是 EventHandler&lt;T&gt; 的副本的委托。
    • 我不知道有EventHandler&lt;T&gt;!谢谢
    【解决方案2】:

    您为参数声明一个委托:

    public enum MyEvents { Event1 }
    
    public delegate void MyEventHandler(MyEvents e);
    
    public static event MyEventHandler EventTriggered;
    

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

    【讨论】:

    • 谢谢,这正是我想要的。我同意你的 cmets。
    • 您可以将其缩短为public static event Action&lt;MyEvents&gt; EventTriggered;
    【解决方案3】:

    我可能会迟到,但是怎么样:

    public event Action<MyEvent> EventTriggered = delegate { }; 
    
    private void Trigger(MyEvent e) 
    { 
         EventTriggered(e);
    } 
    

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

    我发现这在使用 MVVM 时会派上用场,例如在使用 ICommand.CanExecute 方法时。

    【讨论】:

    • 使用现有类的绝佳示例。
    【解决方案4】:

    您需要声明一个自定义事件处理程序。

    public class MyEventArgs: EventArgs
    {
      ...
    }
    
    public delegate void MyEventHandler(object sender, MyEventArgs e);
    
    public class MyControl: UserControl
    {
      public event MyEventHandler MyEvent;
       ...
    }
    

    【讨论】:

      【解决方案5】:

      这里是您的样本的重新设计,以帮助您入门。

      • 您的示例有一个静态事件 - 来自类实例的事件更常见,但我在下面将其保留为静态。

      • 下面的示例还为引发事件的方法使用更标准的命名 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);
               } 
           }
      }
      

      【讨论】:

        【解决方案6】:
        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);
            }
        }
        

        【讨论】:

          【解决方案7】:

          无参数示例:

          delegate void NewEventHandler();
          public event NewEventHandler OnEventHappens;
          

          另外一个班级,你可以订阅

          otherClass.OnEventHappens += ExecuteThisFunctionWhenEventHappens;
          

          并声明该函数不带参数。

          【讨论】:

            猜你喜欢
            • 2020-12-14
            • 1970-01-01
            • 1970-01-01
            • 2022-07-16
            • 1970-01-01
            • 2014-08-30
            • 1970-01-01
            • 2021-04-20
            • 1970-01-01
            相关资源
            最近更新 更多