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

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

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

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

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

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

4b9b3361

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