Каждый раз, когда я начинаю работать над проектом С#, я получаю множество событий, которые просто нужно передать одному элементу. Я придерживаюсь практики EventHandler
/EventArgs
, но мне нравится делать что-то вроде:
public delegate void EventHandler<T>(object src, EventArgs<T> args);
public class EventArgs<T>: EventArgs {
private T item;
public EventArgs(T item) {
this.item = item;
}
public T Item {
get { return item; }
}
}
Позже у меня может быть
public event EventHandler<Foo> FooChanged;
public event EventHandler<Bar> BarChanged;
Однако, кажется, что стандартом для .NET является создание нового делегата и подкласса EventArgs
для каждого типа события. Что-то не так с моим общим подходом?
EDIT: Причина этого сообщения в том, что я только что заново создал это в новом проекте и хотел убедиться, что все в порядке. На самом деле, я воссоздал его, когда я разместил его. Я обнаружил, что существует общий
EventHandler<TEventArgs>
, поэтому вам не нужно создавать общий делегат, но вам все еще нужен общий EventArgs<T>
класс, потому что TEventArgs: EventArgs
.
Другой EDIT: Один недостаток (для меня) встроенного решения - дополнительная многословность:
public event EventHandler<EventArgs<Foo>> FooChanged;
против.
public event EventHandler<Foo> FooChanged;
Для клиентов может быть больно регистрироваться для ваших событий, потому что пространство имен System по умолчанию импортировано по умолчанию, поэтому им приходится вручную искать пространство имен даже при помощи привлекательного инструмента, такого как Resharper... У любого есть идеи относящиеся к этому?