2014-10-27 2 views
1

У меня есть следующий код, который создает кнопку:GetField не работает [События] на кнопке управления

Dim B As New Button 
    B.Parent = Me 
    B.Location = New Point(50, 50) 

    AddHandler B.Click, Sub() 
          MsgBox("Hi") 
         End Sub 

    'I try to get the field info for the click event inorder to get the event handler and remove it 
    Dim FieldInfo As FieldInfo = B.GetType.GetField("Click", BindingFlags.[Static] Or BindingFlags.NonPublic Or BindingFlags.Public) 

    Dim obj As Object = FieldInfo.GetValue(Obj_) 
    Dim EI As EventInfo = Obj_.GetType.GetEvent(EventName) 
    EI.RemoveEventHandler(Obj_, obj) 

но FieldInfo постоянно пустой. Я пробовал со многими именами событий ClickEvent, EventClick ..., но ни один из них не позволил мне получить результат.

Кто-нибудь знает, чего не хватает моему коду, пожалуйста?

Заранее спасибо.

ответ

0

Вам нужно использовать GetEvent(), а не GetField().

См http://msdn.microsoft.com/en-us/library/50943xt0(v=vs.110).aspx

т.е.

Dim myEventInfo As EventInfo = B.GetType.GetEvent("Click", BindingFlags.[Static] Or BindingFlags.NonPublic Or BindingFlags.Public) 

Вы также можете использовать общий метод GetMember, который возвращает (массив) MethodInfo который является суперкласс (FieldInfo, EventInfo) и т.д., она возвращает массив, так как может быть несколько совпадений (т. е. перегруженные методы и т. д.).

+0

Спасибо за ваш ответ. На самом деле я пытаюсь удалить обработчик событий динамически. Вы знаете, возможно ли это без использования GetField? (Я обновил сообщение) –

+0

Это был полный ответ на ваш первоначальный вопрос. Ваш второй вопрос действительно должен быть, ну, второй вопрос! В любом случае, ответ Нинаняна Калы, похоже, охватывает всю оставшуюся информацию, которую вы просили, http://dkowalski.com/blog/archive/2009/12/22/how-to-get-event-handlers-list -using-reflection.aspx. Примите либо ответ. – tolanj

1

Я предлагаю вам пройти через это - How to: Hook Up a Delegate Using Reflection

Получить EventInfo объект, представляющий событие, и используйте EventHandlerType свойство, чтобы получить тип делегата, используемого для обработки событие. В следующем коде EventInfo для события Click имеет значение .

Фрагмент кода:

Dim evClick As EventInfo = tExForm.GetEvent("Click") 
    Dim tDelegate As Type = evClick.EventHandlerType 

Вы можете легко получить их список (type.GetEvents()), добавьте еще один обработчик (EventInfo.AddEventHandler()) или удалить обработчик (EventInfo.RemoveEventHandler()). Чтобы получить список присоединенных делегатов, вам нужно сделать что-то еще.

Ссылки:
Removing Event Handlers using Reflection
How to get event handlers list using reflection
Raise an event via reflection in c#
Getting event via reflection

+0

Благодарим вас за ответ. На самом деле я пытаюсь удалить обработчик событий динамически. Вы знаете, возможно ли это без использования GetField? (Обновлено сообщение) –

+0

проверьте первую ссылку ссылки .. это может вам помочь .. @ThomasCarlton –

+0

@ThomasCarlton: Проверьте точку 4 в ссылке MSDN .., где вы можете получить метод обработки события. если вы знаете об этом. –

Смежные вопросы