Событие С# с настраиваемыми аргументами
Я хочу иметь событие, которое принимает перечисление только как аргумент. Например
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);
}
}
Ответы
Ответ 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;
И объявить эту функцию без параметров.