Проблема в том, что любой может вызвать мой обработчик (и затем вызвать событие), даже в моем бизнес-коде
Это не правда. Вы объявляете событие следующим образом:
public event FooEventHandler Foo;
Единственное, что внешний код может сделать с событием, это подписаться на него (+=
) или отказаться от него (-=
). Он не может получить доступ к фактическому делегату, который генерируется компилятором как личное поле. Другими словами, этот код будет недействительным:
SomeClass x = new SomeClass();
x.Foo(x, new FooEventArgs()); // compilation error here
Не забывайте, что событие на самом деле представляет собой пару методов (добавление и удаление). Компилятор переписывает объявление события во что-то вроде этого:
private FooEventHandler _foo;
public event FooEventHandler Foo
{
add { _foo += value; }
remove { _foo -= value; }
}
(сгенерированный код на самом деле немного сложнее, с некоторой блокировкой для обеспечения безопасности потока)
Как видите, поле _foo
является закрытым, поэтому клиентский код не может получить к нему доступ. Доступны только методы доступа add
и remove
.