Решение удалить обработчик событий динамически (используя отражение). Есть лучший способ сделать это?
Мне нужно было удалить обработчики событий из элемента управления, загруженного из библиотеки DLL, для которой у меня нет кода. Поскольку, по-видимому, он не является "официальным" (то есть поддерживается публичными методами .NET Framework), я смог создать пару методов расширения, которые сделали именно это с помощью Reflection.
Смотрите этот блог для всех деталей:Удаление события из элемента управления WinForm ListView с помощью отражения
Вот пример кода того, как удалить событие 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)?
Похожие сообщения:
How would that be possible to remove all event handlers of the Click event of a Button? - uses a similar solution to mine, but I don't think their solution works