Является ли перенаправление событий хорошей практикой в C #? Если это правда, кто должен быть «отправителем»?

2

Теперь я реорганизую код, написанный кем-то другим, и я нашел конструкцию, о которой я испытываю смешанные чувства. Существует элемент ListView-like, и каждый из его элементов может поднять событие "DialogOpened". Тем не менее, может быть громоздко регистрировать внешние обработчики событий для каждого из элементов (и элементы могут быть добавлены или удалены динамически!). По этой причине в элементе управления ListView есть одно событие, и оно называется "ItemDialogOpened". Это звучит для меня все разумно, но есть две проблемы:

  • В элементе управления ListView, подобном элементу ListView, есть метод 'OnItemDialogOpened', который вызывает одно событие, но этот метод не вызывается напрямую. Вместо этого он регистрируется как обработчик события "DialogOpened" для каждого элемента. Это хорошо? Я спрашиваю, потому что я не смог найти ничего похожего на него в MSDN.
  • Если такое перенаправление событий в порядке, то кто должен быть отправителем этого финального, единственного события? Теперь, в коде, с которым я работаю, это оригинальный отправитель - элемент. Тем не менее, я думаю (но я не уверен в этом), что теперь отправитель должен быть изменен на элемент управления ListView. Я прав?
Теги:
events

2 ответа

1
Лучший ответ

Для 1: этот подход не полностью вписывается в стандартный шаблон потока. С моей точки зрения, вы должны скрыть свою собственную логику реализации в приватном методе (этот метод будет конечной точкой для каждого элемента событие DialogOpened), а затем этот метод вызовет защищенный виртуальный метод OnItemDialogOpened. В этом случае listview может быть унаследован, коммуникационная логика будет прозрачной и более ms-подобной, и абонент будет работать без кастинга (поскольку кастинг скрыт в вашем личном методе). Что-то вроде этого:

private void DialogOpenedHandler(object sender, EventArgs e)
{
    OnItemDialogOpened(new ItemEventArgs((YourItemClass)sender);
}

protected virtual OnItemDialogOpened(ItemEventArgs e)
{
    // call event here 
}
3

Для 2 - он немного открыт для интерпретации. В целом вы ожидаете, что sender будет тем, на кого вы подписаны; любая другая информация должна передаваться через args - но есть исключения, где (например) отдельный элемент проходит через sender.

Важно четко документировать его.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню