【问题标题】:How to remove all event handlers from an event?如何从事件中删除所有事件处理程序?
【发布时间】:2014-10-27 04:27:05
【问题描述】:

我有以下课程

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)

表示不知何故我的事件未被识别为字段。

有谁知道如何从事件中删除所有事件处理程序?

提前干杯。

【问题讨论】:

    标签: vb.net reflection


    【解决方案1】:

    正是 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
    

    我会重申,你不应该这样做。

    【讨论】:

      猜你喜欢
      • 2021-10-29
      • 1970-01-01
      • 2012-09-04
      • 2016-07-05
      • 2023-03-13
      • 1970-01-01
      相关资源
      最近更新 更多