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

相关问题