Мы все знакомы с ужасом, который является объявлением события С#. Чтобы обеспечить безопасность потока, стандарт должен написать что-то вроде этого:
public event EventHandler SomethingHappened;
protected virtual void OnSomethingHappened(EventArgs e)
{
var handler = SomethingHappened;
if (handler != null)
handler(this, e);
}
Недавно в каком-то другом вопросе на этой доске (который я не могу найти сейчас) кто-то отметил, что методы расширения могут быть использованы в этом сценарии. Вот один из способов сделать это:
static public class EventExtensions
{
static public void RaiseEvent(this EventHandler @event, object sender, EventArgs e)
{
var handler = @event;
if (handler != null)
handler(sender, e);
}
static public void RaiseEvent<T>(this EventHandler<T> @event, object sender, T e)
where T : EventArgs
{
var handler = @event;
if (handler != null)
handler(sender, e);
}
}
С помощью этих методов расширения все, что вам нужно объявить и поднять событие, выглядит примерно так:
public event EventHandler SomethingHappened;
void SomeMethod()
{
this.SomethingHappened.RaiseEvent(this, EventArgs.Empty);
}
Мой вопрос: Это хорошая идея? Не хватает ли мы чего-либо, не имея стандартного метода On? (Одна вещь, которую я замечаю, это то, что она не работает с событиями, у которых есть явный код добавления/удаления.)