2014-10-26 4 views
0

У меня есть следующий классКак удалить все обработчики событий из события?

Public Class SimpleClass 
    Public Event SimpleEvent() 

    Public Sub SimpleMethod() 
     RaiseEvent SimpleEvent() 
    End Sub 
End Class 

Я его, как создание экземпляра

Obj = New SimpleClass 

    AddHandler Obj.SimpleEvent, Sub() 
            MsgBox("Hi !") 
           End Sub 

И я пытаюсь удалить обработчик событий динамически созданный с помощью кода в: Code Project

(I принять сложное приложение, где это трудно использовать: RemoveHandler Obj.Event, AddressOf Me.EventHandler)

В своем коде есть следующий метод

Private Shared Sub BuildEventFields(t As Type, lst As List(Of FieldInfo)) 
    For Each ei As EventInfo In t.GetEvents(AllBindings) 
     Dim dt As Type = ei.DeclaringType 
     Dim fi As FieldInfo = dt.GetField(ei.Name, AllBindings) 
     If fi IsNot Nothing Then 
      lst.Add(fi) 
     End If 
    Next 
End Sub 

Но при вызове этого кода, используя мой тип объекта, следующая строка ничего не возвращает

Dim fi As FieldInfo = dt.GetField(ei.Name, AllBindings) 

означает, что какое-то образом мое событие не признается в качестве поля ,

Кто-нибудь знает, как удалить все обработчики событий из события?

Приветствия заранее.

ответ

3

Это выражение лямбды, которое вызывает у вас неприятности. Не копайте более глубокое отверстие, просто используйте AddressOf и частный метод, чтобы вы могли тривиально использовать оператор RemoveHandler.

Если вам абсолютно необходимо помнить, что компилятор VB.NET автоматически создает поле хранилища резервных копий для события с тем же именем, что и событие с добавлением «Событие». Что делает этот код работы:

Dim Obj = New SimpleClass 
    AddHandler Obj.SimpleEvent, Sub() 
            MsgBox("Hi !") 
           End Sub 

    Dim fi = GetType(SimpleClass).GetField("SimpleEventEvent", BindingFlags.NonPublic Or BindingFlags.Instance) 
    fi.SetValue(Obj, Nothing) 

    Obj.SimpleMethod()  '' No message box 

Повторяю, что вы не должны этого делать.

+0

You rock man !! Спасибо ! –