C # событие с пользовательскими аргументами - PullRequest
39 голосов
/ 18 сентября 2010

Я хочу иметь событие, которое принимает перечисление только в качестве аргумента. Например

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

Ответы [ 7 ]

62 голосов
/ 18 сентября 2010

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 });
     } 
 } 
22 голосов
/ 18 сентября 2010

Вы объявляете делегата для параметров:

public enum MyEvents { Event1 }

public delegate void MyEventHandler(MyEvents e);

public static event MyEventHandler EventTriggered;

Хотя все события в платформе принимают параметр, который является или происходит от EventArgs, вы можете использовать любые параметры, которые вам нравятся. Тем не менее, люди могут ожидать, что шаблон, используемый в фреймворке, может затруднить выполнение вашего кода.

12 голосов
/ 12 ноября 2014

Я могу опоздать в игре, но как насчет:

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

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

Установка события для анонимного делегата не позволяет мне проверить, не является ли событие нулевым.

Я считаю, что это удобно при использовании MVVM, как при использовании метода ICommand.CanExecute.

5 голосов
/ 18 сентября 2010

Вам необходимо объявить пользовательский обработчик событий.

public class MyEventArgs: EventArgs
{
  ...
}

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

public class MyControl: UserControl
{
  public event MyEventHandler MyEvent;
   ...
}
3 голосов
/ 18 сентября 2010

Вот переделка вашего примера, чтобы вы начали.

  • в вашем образце есть статическое событие - более обычно событие приходит из экземпляра класса, но яоставьте его статичным ниже.

  • в примере ниже также используется более стандартное именование 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);
         } 
     }
}
1 голос
/ 18 сентября 2010
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);
    }
}
0 голосов
/ 14 мая 2019

Пример без параметров:

delegate void NewEventHandler();
public event NewEventHandler OnEventHappens;

А из другого класса вы можете подписаться на

otherClass.OnEventHappens += ExecuteThisFunctionWhenEventHappens;

и объявить эту функцию без параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...