Каждый раз, когда я начинаю глубоко в проекте C #, я сталкиваюсь с большим количеством событий, которым действительно нужно пропустить один элемент. Я придерживаюсь практики 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
для каждого типа события. Что-то не так с моим общим подходом?
<Ч />
РЕДАКТИРОВАТЬ: Причина этого поста в том, что я просто воссоздал это в новом проекте, и хотел убедиться, что это было хорошо. На самом деле, я воссоздал его, как я написал. Я обнаружил, что существует универсальный EventHandler<TEventArgs>
, поэтому вам не нужно создавать универсальный делегат, но вам все еще нужен универсальный класс EventArgs<T>
, потому что TEventArgs: EventArgs
.
<Ч />
Другой РЕДАКТИРОВАТЬ: Один недостаток (для меня) встроенного решения является дополнительная детализация:
public event EventHandler<EventArgs<Foo>> FooChanged;
против
public event EventHandler<Foo> FooChanged;
Тем не менее, клиентам может быть неудобно регистрироваться для ваших событий, поскольку пространство имен System импортируется по умолчанию, поэтому им приходится вручную искать ваше пространство имен, даже с помощью такого необычного инструмента, как Resharper ... У кого-нибудь есть какие-либо идеи относящиеся к этому?