2014-10-26 210 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

(我假設一個難以使用的複雜應用程序: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

這是使你陷入麻煩的lambda表達式。不要挖更深的洞,只需使用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

你搖滾的人!謝謝 ! – 2014-10-27 01:25:44

相關問題