Подтвердить что ты не робот

Событие С# с настраиваемыми аргументами

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

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

Ответ 1

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

public enum MyEvents { Event1 }

public delegate void MyEventHandler(MyEvents e);

public static event MyEventHandler EventTriggered;

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

Ответ 2

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

Ответ 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;

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