【问题标题】:Find out from within a class if an event handler exists in another class从一个类中找出另一个类中是否存在事件处理程序
【发布时间】:2021-12-11 21:58:54
【问题描述】:

一个 VB.NET 4 问题。

假设存在一个包含事件 E 的类 A。在另一个类 (B) 中,声明了 A 类型的变量 WithEvents。在使用 A 的代码的某个时间点,将会有一个“RaiseEvent E”命令。之后,有没有办法知道 E 是否在 B 中被处理(只要事件 E 的处理程序存在于 B 类中)?

显然 E 可以包含一个参数(即布尔值),因此如果 B 中的处理程序处理它,它可以将此参数设置为 True。这不是我要问的。我想知道是否有一种内置于.NET 的方式来实现这一点,而不使用任何参数。

我试图避免的代码示例(使用参数 DoSomethingWasHandled):

    Public Class A
        Public Event DoSomething(ByRef DoSomethingWasHandled As Boolean)
    
        Public Sub RaiseDoSomething()
            Dim DoSomethingWasHandled As Boolean = False
            RaiseEvent DoSomething(DoSomethingWasHandled)
        End Sub
    End Class
    
    Public Class B
        Public WithEvents SomeA As New A
    
        Private Sub HandleDoSomething(ByRef DoSomethingWasHandled As Boolean) Handles SomeA.DoSomething
            DoSomethingWasHandled = True
        End Sub
    End Class

我询问是否存在的代码示例:

    Public Class A
        Public Event DoSomething()
    
        Public Sub RaiseDoSomething()
            RaiseEvent DoSomething()
            If DoSomething.WasHandled Then '<-- Does this check exist in any form? ***
                DoSomethingElse()
            End If
        End Sub
    End Class
    
    Public Class B
        Public WithEvents SomeA As New A
    
        Private Sub HandleDoSomething() Handles SomeA.DoSomething
            'DoStuff...
        End Sub
    End Class

*** 这只会检查 B 类中是否存在 E 的事件处理程序,如果存在则返回 True,如果不存在则返回 False。

【问题讨论】:

  • 如果你在餐厅工作,有人点了外卖,然后把他/她的食物带回家,你知道他/她是吃过还是放在冰箱里供以后食用?
  • 我认为那将是一个糟糕的设计。您正在引发事件以供消费者处理。你不应该知道或关心事件的消费者做了什么。你有一个真实的用例吗?
  • @HardCode:我想知道用户是否处理了特定事件,如果没有,则执行一些默认操作。
  • @FaultyOverflow 这不是现实世界的用例,而是理论上的用例。如果你能详细描述一个用例,这将有助于你想办法解决问题。
  • 我认为理论上,您可以检查事件的订阅者(在 C# 中您对委托具有较低级别的访问权限可能更容易)。在实践中,最好使用ByRef 参数来获取信息。

标签: vb.net events event-handling .net-4.0


【解决方案1】:

像这样。

Public Class A
    Public Event DoSomething(e As Object)

    Public Sub RaiseDoSomething()
        ' adding 'Event' to the variable name of
        '  the event allows it to be checked
        If DoSomethingEvent IsNot Nothing Then 'does the event have a subscriber(Event Handler)?
            'yes
            RaiseEvent DoSomething("TEST") 'because there is a handler this will be handled
        End If
    End Sub
End Class

Public Class B
    Public WithEvents SomeA As New A

    Private Sub HandleDoSomething(e As Object) Handles SomeA.DoSomething
        Debug.WriteLine("Do")
    End Sub
End Class

测试

    Dim FOOa As New A
    Dim fooB As New B

    FOOa.RaiseDoSomething()
    fooB.SomeA.RaiseDoSomething()

【讨论】:

  • 我已经使用您的示例来更新我的 OP,以便更好地可视化我想要避免的内容,这就是使用参数 DoSomethingWasHandled。我只是想知道 .NET 是否有内置的东西,以便开发人员知道 B 类中是否存在“处理 SomeA.DoSomething”的子类。
  • @FaultyOverflow - 我已经用我相信的你正在寻找的答案更新了我的答案。
  • 不,不完全是。再次更新 OP 以反映我的要求。
  • @FaultyOverflow - 什么?您可能需要花一点时间重新考虑一下。
  • 我会在这里问“为什么”,但我的最终答案是“没关系”。我认为无论如何都不支持它。无论如何,感谢您坚持并试图理解我在问什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-20
  • 1970-01-01
相关资源
最近更新 更多