Тип EventHandler без аргументов событий - PullRequest
10 голосов
/ 17 сентября 2011

Когда мы хотим передать данные подписчику события, мы используем для этого EventArgs (или CustomEventArgs).

.Net предоставляет встроенный тип EventHandler, который в качестве параметра использует также экземпляр класса EventArgs, который также встроен.

А как насчет случаев, когда мне нужно уведомить абонента о том, что какое-то действие завершено, например, поиск завершен? Я не хочу даже использовать EventArgs, который не будет ничего содержать.

Существует ли встроенный тип для сигнализации другого класса, без необходимости использования пустых EventArgs?

Ответы [ 4 ]

12 голосов
/ 17 сентября 2011

Я бы действительно посоветовал вам использовать стандартный паттерн EventHandler и просто передать EventArgs.Empty;однако вы можете использовать Action в качестве типа события, которое вам действительно нужно - это просто необычно.

7 голосов
/ 17 сентября 2011

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

если вы действительно не хотите передавать эти события из своего собственного кода, просто передайте EventArgs.Empty в качестве второго параметра.

7 голосов
/ 17 сентября 2011

Вы можете сделать несколько вещей:

  1. Использовать ваше обычное событие с EventHandler и базовым классом EventArg - конечно, оно пустое, но это мешает?
  2. Создайте свой собственный делегати используйте это с event MyDelegateWithoutParams MyEvent;
  3. Вместо этого используйте Observer-Pattern с IObservable
  4. Позвольте клиентам пройти Действие и вызовите это действие

Я надеюсьодин из этих вариантов вам по вкусу.Я использую 1 и 4 для такой ситуации (в основном 4, если будет только один «слушатель»).

PS: Полагаю, что 2 не будет соответствовать .net Framework Guidelines так что, возможно, это не лучшая идея;)

3 голосов
/ 16 июня 2016

Использовать действия (ниже ответ скопирован с https://stackoverflow.com/a/1689341/1288473):

Объявление:

public event Action EventWithoutParams; 
public event Action<int> EventWithIntParam;

Вызов:

if (EventWithoutParams != null) EventWithoutParams(); 
if (EventWithoutParams != null) EventWithIntParam(123);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...