Есть ли обработчик для события X? - PullRequest
0 голосов
/ 30 июля 2011

Можно ли с помощью VB.NET определить, есть ли к какому-либо событию какие-либо обработчики? Я не являюсь владельцем события, в данном конкретном случае я хочу знать, для какого из элементов в Windows.Forms.MenuStrip обработано событие ToolstripMenuItem.Click.

1 Ответ

1 голос
/ 30 июля 2011

Я не думаю, что это возможно без создания собственной структуры событий или, возможно, использования отражения, чтобы получить доступ к частным элементам, реализованным в компиляторе.

Я просто скомпилировал небольшой фрагмент и пропустил его через Reflector.

Оригинальный код

       RemoveHandler d.CollectionChanged, AddressOf DestinationsChanged
       AddHandler d.CollectionChanged, AddressOf DestinationsChanged

Что закончилось в отражателе

     Me.$STATIC$get_Destinations$200126C$d.remove_CollectionChanged(New NotifyCollectionChangedEventHandler(Me, DirectCast(Me.DestinationsChanged, IntPtr)))
     Me.$STATIC$get_Destinations$200126C$d.add_CollectionChanged(New NotifyCollectionChangedEventHandler(Me, DirectCast(Me.DestinationsChanged, IntPtr)))

Обратите внимание, что .net, похоже, использует некоторые сгенерированные компилятором наблюдаемые коллекции для отслеживания событий.

Вы + могли бы + иметь возможность использовать отражение, чтобы добраться до класса и извлечь эти внутренне определенные коллекции, а затем перечислить их содержимое, но я никогда не пробовал.

Другой вариант может заключаться в том, чтобы свернутьсобственная структура обработки событий для рассматриваемого события.

Подробнее об этом читайте в этой статье.

http://www.codeproject.com/KB/cs/EventChain.aspx

Чтобы продолжить исследование, я настоятельно рекомендую захватитькопия рефлектора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...