Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在VB.NET中记录和回放引发的事件_.net_Vb.net_Events - Fatal编程技术网

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

在VB.NET中记录和回放引发的事件,.net,vb.net,events,.net,Vb.net,Events,我使用VB.NET中的事件实现了两个类之间的通信。现在我想存储(记录)所有发生的事件,并在以后重新引发(重播)它们 以下是我已经得到的: 类别1: Public Event Button1Pressed(ByVal sender As Object) Private Sub btnButton_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnButton.Click RaiseEvent Button1Pre

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

以下是我已经得到的:

类别1:

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
我可以向我想要记录的事件添加另一个处理程序,但是在处理程序中,我只获取传递给事件的参数,而不是事件本身。另一件我不知道如何解决的事情是,我不能从外部类引发事件


我的问题有好的解决方法吗?

要记录事件,您可以制作一个辅助方法来进行记录和提升。因此,与此相反:

RaiseEvent Button1Pressed(Me)
这样做:

Sub RaiseButton1PressedEvent()
  RaiseEvent Button1Pressed(Me)  <--raise the event

  RecordEvent("Button1Pressed")  <--record the event
End Sub
现在,如果你有很多活动,这可能会变得乏味。有两种很好的方法可以解决这个问题:

  • 可能有一种基于事件名称使用反射来引发事件的方法,因此您可以为每个事件实现一个通用函数,而不是一个,也就是说:您可以使用一个
    子RaiseEventByName(sEventName作为字符串)来代替
    子RaiseButton1PressedEvent()

  • 使用“代码生成”为要跟踪的每个事件发出带有Raise和RELAY方法的分部类


  • 谢谢你的回答。我希望有一个更优雅的解决方案,但也许这是唯一的方法。你知道内置在VisualStudio中的T4模板系统吗?它使代码生成非常容易。我一直在使用它来生成许多类似但不完全相同的方法。例如,这就是创建类型化数据集和LinqToEntities实体类的方式。这是一件完全合理的事情。
    Sub ReplayButton1PressedEvent()
      RaiseEvent Button1Pressed(Me)  <--raise the event
    End Sub