【问题标题】:Record and replay raised events in VB.NET在 VB.NET 中记录和重播引发的事件
【发布时间】:2012-03-13 14:54:01
【问题描述】:

我通过使用 VB.NET 中的事件来实现两个类之间的通信。现在我想存储(记录)所有发生的事件,并在以后再次重新引发(重播)它们。

这是我已经拥有的:

第一类:

Public Event Button1Pressed(ByVal sender As Object)

Private Sub btnButton_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnButton.Click
    RaiseEvent Button1Pressed(Me)
End Sub

Public Sub handleDisplayChanged(ByVal sender As System.Object, ByVal txt As String)

        '... Some code
End Sub

第 2 类:

Public Event DisplayTextChangedEvent(ByVal sender As System.Object, ByVal text As String)

'In the constructor:
AddHandler Me.DisplayTextChangedEvent, AddressOf class1Instance.displayText
AddHandler class1Instance.Button1Pressed, AddressOf Me.buttonPressed

'Somewhere in the logic:
Public Sub buttonPressed(ByVal sender As Object)

    'Compute text
    '...
    RaiseEvent DisplayTextChangedEvent(text)
End Sub

我可以为要记录的事件添加另一个处理程序,但是在处理程序中我只得到传递给事件的参数,而不是事件本身。我不知道如何解决的另一件事是,我无法从外部类引发事件。

我的问题有什么好的解决方案吗?

【问题讨论】:

    标签: .net vb.net events


    【解决方案1】:

    要记录事件,您可以创建一个辅助方法来进行记录和提升。所以不要这样:

    RaiseEvent Button1Pressed(Me)
    

    这样做:

    Sub RaiseButton1PressedEvent()
      RaiseEvent Button1Pressed(Me)  <--raise the event
    
      RecordEvent("Button1Pressed")  <--record the event
    End Sub
    

    RecordEvent 所做的事情当然必须经过设计。

    要从外部类引发事件,请实现此方法:

    Sub ReplayButton1PressedEvent()
      RaiseEvent Button1Pressed(Me)  <--raise the event
    End Sub
    

    现在,如果您有很多活动,这可能会变得乏味。有几个很好的方法可以解决这个问题:

    1. 可能有一种方法可以根据事件的名称使用反射来引发事件,因此您可以为每个事件实现一个通用函数而不是一个通用函数,即:代替Sub RaiseButton1PressedEvent(),您可以有一个Sub RaiseEventByName(sEventName As String)

    2. 使用代码生成为要跟踪的每个事件发出带有 Raise 和 Replay 方法的部分类。

    【讨论】:

    • 感谢您的回答。我希望有一个更优雅的解决方案,但也许这是唯一的方法。
    • 您知道 Visual Studio 中内置的 T4 模板系统吗?它使代码生成非常容易。我一直将它用于我想要生成许多相似但不相同的方法的情况。例如,这就是创建类型化数据集和 LinqToEntities 实体类的方式。这是一件完全合理的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多