Rozwiązanie umożliwiające dynamiczne usuwanie obsługi zdarzeń (za pomocą odbicia). Czy jest lepszy sposób, aby to zrobić?

Musiałem usunąć programy obsługi zdarzeń z kontrolki załadowanej z biblioteki DLL, dla której nie mam kodu. Ponieważ nie wydaje się, aby istniał „oficjalny” (tj. Wspierany przez publiczne metody .NET Framework), byłem w stanie stworzyć kilka metod rozszerzających, które zrobiły dokładnie to przy użyciu Reflection.

Zobacz ten wpis na blogu, aby poznać wszystkie szczegóły:Usuwanie zdarzenia z kontrolki WinForm ListView za pomocą odbicia

Oto przykładowy kod, jak usunąć zdarzenie SelectedIndexChanged (dynamicznie i bez dostępu do oryginalnego programu obsługi)

//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

Moje pytanie brzmi: „czy istnieje inny sposób?”

Chociaż moje rozwiązanie działa i wydaje się stabilne, robię wewnętrzną manipulację obiektami .NET, więc może jest lepsze rozwiązanie (w wersji 4.0 lub 4.5)?

Powiązane posty:

W jaki sposób byłoby możliwe usunięcie wszystkich programów obsługi zdarzeń z zdarzenia Click przycisku? - używa podobnego rozwiązania do mojego, ale nie sądzę, aby ich rozwiązanie działało

questionAnswers(0)

yourAnswerToTheQuestion