Рассмотрим этот сценарий. У меня есть объект, давайте назовем его .... Фу. Foo вызывает простое событие под названием «Loaded». Как часть информации о событии, потребители должны будут знать, какой объект foo вызвал событие. Наша команда приняла следующий шаблон.
1) Создайте новый класс, который наследуется от EventArgs - например,
FooEventArgs: System.EventArgs.
2) Добавьте свойство типа Foo в FooEventArgs, которое устанавливается путем передачи через конструктор.
3) Объявите событие, используя общую версию EventHandler, поэтому
public event EventHandler<FooEventArgs> Loaded;
4) Вызвать событие из класса Foo со следующей подписью:
Loaded(this, new FooEventArgs(this));
По сути, это делает "отправителя" объектом foo, но также помещает ссылку на объект foo в аргумент события как строго типизированное свойство.
Одним из преимуществ этого является то, что никто не должен беспокоиться о том, чтобы кастовать «отправителя», когда они обрабатывают событие, что снижает связь между потребителем события и источником события. Другое «преимущество» состоит в том, что если когда-либо должен измениться тип сборщика событий и, следовательно, строго типизированное свойство (что, мы надеемся, никогда не произойдет), то вместо простого запуска кода происходит сбой при приведении, когда он выходит как нулевой, API фактически ломается, поэтому его можно исправить во время компиляции.
Мне кажется, что эта модель может быть излишней. Должны ли они больше доверять параметру «отправитель» и исключать аргументы пользовательских событий? Моя команда утверждает, что никто на самом деле не использует параметр отправителя. Как лучше всего передавать ссылку на объект, вызывающий события?
РЕДАКТИРОВАТЬ: Отличная обратная связь, я оставлю это открытым в течение еще одного дня или около того, прежде чем я приму один.