我通过使用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
我可以为我想要记录的事件添加另一个处理程序,但是在处理程序中我只获取传递给事件的参数而不是事件本身。我不知道如何解决的另一件事是,我不能从外部班级提出一个事件。
我的问题有一个很好的解决方案吗?
答案 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
现在,如果你有很多事件,这可能会变得乏味。有几种很好的方法可以解决这个问题:
根据事件的名称,可能有一种使用反射引发事件的方法,因此您可以为每个事件实现一个通用函数而不是一个,即:而不是Sub RaiseButton1PressedEvent()
,你可以有Sub RaiseEventByName(sEventName As String)
使用代码生成为要跟踪的每个事件使用“提升”和“重放”方法发出部分类。