在VB.NET中记录和重放引发的事件

时间:2012-03-13 14:54:02

标签: .net vb.net events

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

这是我已经拥有的:

的Class1:

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

我可以为我想要记录的事件添加另一个处理程序,但是在处理程序中我只获取传递给事件的参数而不是事件本身。我不知道如何解决的另一件事是,我不能从外部班级提出一个事件。

我的问题有一个很好的解决方案吗?

1 个答案:

答案 0 :(得分:0)

要录制事件,您可以制作一个辅助方法来执行录制和提升。所以不要这样:

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. 使用代码生成为要跟踪的每个事件使用“提升”和“重放”方法发出部分类。