При программировании событий на C # рекомендуется создать делегат в форме:
delegate XEventHandler(object sender, XEventArgs e);
У меня вопрос по первому аргументу делегата object sender. Это всегда должно быть универсальным object? Наличие отправителя типа objectвсегда приводит к коду, подобному этому.
val = ((ConcreteType)sender).Property;
или, еще более многословный,
ConcreteType obj = sender as ConcreteType
if (obj != null) { ... }
Один аргумент против строго типизированных отправителей заключается в том, что другие объекты могут пересылать событие, не заботясь о типе. Хотя это может иметь смысл в средах с графическим интерфейсом, я не уверен, что это может принести пользу вне графического интерфейса.
Что если класс отправителя всегда известен (по крайней мере, как абстрактный класс)? Например, если я реализую ListChangedсобытие в абстрактном Listклассе и если другие классы собираются его унаследовать (например LinkedList, ArrayList), можно ли определить мой делегат с отправителем типа List?
delegate ListChangedEventHander(List sender, ListChangedEventArgs e);
Или есть ли обратная сторона в изменении обычного типа object senderна более конкретный?