Он по-прежнему будет работать с событиями, которые имеют явное добавление / удаление - вам просто нужно использовать переменную делегата (или как вы сохранили делегат) вместо имени события.
Однако есть более простой способ сделать его поточно-ориентированным - инициализировать его с помощью неоперативного обработчика:
public event EventHandler SomethingHappened = delegate {};
Производительность при вызове дополнительного делегата будет незначительной, и это, несомненно, облегчит код.
Кстати, в вашем методе расширения вам не нужна дополнительная локальная переменная - вы можете просто сделать:
static public void RaiseEvent(this EventHandler @event, object sender, EventArgs e)
{
if (@event != null)
@event(sender, e);
}
static public void RaiseEvent<T>(this EventHandler<T> @event, object sender, T e)
where T : EventArgs
{
if (@event != null)
@event(sender, e);
}
Лично я бы не использовал ключевое слово в качестве имени параметра, но оно на самом деле не меняет вызывающую сторону, поэтому делайте что хотите:)
РЕДАКТИРОВАТЬ: Что касается метода "OnXXX": планируете ли вы получать ваши классы из? На мой взгляд, большинство классов должны быть запечатаны. Если вы делаете , хотите ли вы, чтобы эти производные классы могли вызвать событие? Если ответ на любой из этих вопросов «нет», не беспокойтесь. Если ответ на оба вопроса "да", тогда делайте:)