Рассмотрим этот сценарий. У меня есть объект, позвольте назвать его.... Foo. 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 действительно ломается, поэтому его можно зафиксировать во время компиляции.
Мне кажется, что этот шаблон кажется излишним. Должны ли они больше доверять параметру "отправитель" и отбрасывать аргументы настраиваемого события? Моя команда утверждает, что никто не использует параметр отправителя. Какая наилучшая практика для передачи ссылки на объект, создающий событие?
EDIT: Отличная обратная связь до сих пор, я оставлю это открытым еще на один день или около того, прежде чем принять его.