【发布时间】: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