Тип EventHandler без аргументов событий

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

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

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

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

Ответ 1

Вы можете сделать пару вещей:

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

Я надеюсь, что один из этих вариантов вам по вкусу. Я использую 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);