Мне нужно было удалить обработчики событий из элемента управления, загруженного из DLL, для которого у меня нет кода. Поскольку, похоже, не существует "официального" (т.е. Поддерживается общедоступными методами .NET Framework), мне удалось создать несколько методов расширения, которые выполнялись именно с использованием Reflection.
Смотрите эту запись в блоге для всех деталей: Удаление события из элемента управления ListView WinForm с использованием отражения
Вот пример кода, как удалить событие SelectedIndexChanged (динамически и без доступа к исходному обработчику)
//for a UserControl (in fact any control that implements System.ComponentModel.Component)
var userControl = new UserControl();
//we can get the current mapped event handlers
userControl.eventHandlers();
//its signature
userControl.eventHandlers_MethodSignatures();
//remove one by using the static field name
userControl.remove_EventHandler("EVENT_SELECTEDINDEXCHANGED");
//or use this one specifically mapped to the SelectedIndexChanged event
userControl.remove_Event_SelectedIndexChanged
Мой вопрос: "Есть ли другой способ?"
Хотя мое решение работает и кажется стабильным, я делаю внутренние манипуляции с объектами .NET, поэтому, возможно, есть лучшее решение (в 4.0 или 4.5)?
Похожие сообщения:
- Как можно удалить все обработчики событий события Click кнопки? - использует аналогичное решение для моего, но я не думаю, что их решения работают