Каждый раз, когда я начинаю в проекте C#, я получаю множество событий, которые просто нужно передать одному элементу. Я придерживаюсь с практикой EventHandler
/EventArgs
, но то, что я хочу сделать, это что-то вроде:.NET EventHandlers - общий или нет?
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 ... У кого-нибудь есть идеи, связанные с этим?
Для стиля CRUD, о котором вы упоминали в другом комментарии, у меня был бы EntityEventHandler, который был бы самоописательным. –
2008-09-24 20:39:36
вы можете добавить: с помощью FooArgs = Namespace.EventArgs; который очистит событие до - public event EventHandler FooChanged; –
Fraser
2012-04-25 13:38:18