Тип EventHandler без аргументов событий
Когда мы хотим передать данные подписчику событий, для этого мы используем EventArgs (или CustomEventArgs).
.Net предоставляет сборку типа EventHandler, которая использует в качестве параметра экземпляр класса EventArgs, который также встроен.
Как насчет случаев, когда мне нужно уведомить абонента о завершении какого-либо действия, например, поиск завершен? Я не хочу даже использовать EventArgs, который не будет содержать ничего.
Есть ли встроенный тип для сигнализации другого класса, без необходимости использовать пустые EventArgs?
Ответы
Ответ 1
Вы можете сделать пару вещей:
- Используйте ваше обычное событие с EventHandler и базовым классом EventArg - конечно, оно пустое, но это мешает?
- Создайте свой собственный делегат и используйте его с
event MyDelegateWithoutParams MyEvent;
- Вместо этого используйте Observer-Pattern с IObservable
- Позвольте клиентам пройти Акция и вызвать это Акция
Я надеюсь, что один из этих вариантов вам по вкусу. Я использую 1 и 4 для такой ситуации (в основном 4, если будет только один "слушатель").
PS: я думаю, что 2 не будет соответствовать рекомендациям .NET Framework, так что, возможно, это не лучшая идея;)
Ответ 2
Я бы посоветовал вам использовать стандартный EventHandler patter здесь и просто передать EventArgs.Empty
; однако вы можете использовать Action
как тип события, которого вы действительно хотите - это просто необычно.
Ответ 3
Если вы используете plain delegates
, вы можете делать то, что хотите, но если вы используете events
, я думаю, что лучше всего придерживаться стандарта и всегда иметь отправителя object
и EventArgs
e.
Если у вас действительно нет того, что передать об этих событиях из вашего собственного кода, просто передайте EventArgs.Empty
в качестве второго параметра.
Ответ 4
Используйте действия (ответ ниже скопирован с fooobar.com/info/316816/...):
Объявление:
public event Action EventWithoutParams;
public event Action<int> EventWithIntParam;
Вызов:
EventWithoutParams?.Invoke();
EventWithIntParam?.Invoke(123);