VB.NET通过引用调用事件处理程序

时间:2018-06-01 12:17:24

标签: vb.net events event-handling raiseevent

来自Deplhi我曾经可以使用简单的

直接从实例调用事件处理程序
Button.OnMouseOver([arguments])

现在我使用的是VB.NET,我无法找到一种方法来触发事件的处理程序而不会实际触发事件。

对我在这里所做的一些解释:在创建新表单时,我解析其内容以根据变量设置所有颜色。 根据是否启用按钮,它具有不同的颜色,但如果在创建时禁用了按钮,则仍需要通过处理程序来修正其颜色。

这就是我正在使用的

AddHandler ButtonInstance.EnabledChanged, AddressOf Button_EnabledChanged
Button_EnabledChanged(ButtonInstance, New EventArgs)

这是正常的,我仍然希望能够直接从它处理的对象中调用该方法,因为我并不总是知道事件处理程序的名称预先。

我一直指向RaiseEvent,但它似乎没有做我需要的。

有没有办法检索事件的处理程序或触发它而不实际干扰实例?

2 个答案:

答案 0 :(得分:0)

在不触发事件本身的情况下调用事件处理程序有什么意义?

如果您已在代码中定义了该事件,则可以使用RaiseEvent EventName触发该事件,但这不是EnabledChanged的情况,因为它是在基类中定义的。您还可以在其名称中添加事件后缀以使用其处理程序等,如EventNameEvent.GetInvocationList

如果您的事件是在无法修改的基类中声明的,则可以继承该类并调用OnEventName方法,这些方法应该触发事件并调用所有操作符。 OnEventName方法的实际实现可以防止事件被触发。这取决于基类的实现。

手动查找和触发继承事件的事件处理程序需要反射。

答案 1 :(得分:0)

简单的答案是否定的。我确信在技术上可以使用反射来获取已添加到事件中的委托列表并调用每个委托,但这将是一个丑陋的黑客攻击,应该只使用最多绝望的情况。如果你需要这样做,VB.NET中最好的方法是设置一个事件处理程序,它总是在引发事件时被调用(这样你也可以直接调用它),然后包含一个委托列表然后它依次调用。换句话说,使用委托创建自己的类似事件的机制,提供您所需的灵活性。例如,像这样:

Private _clickActions As New List(Of Action)()

Public Sub AddClickAction(action As Action)
    _clickActions.Add(action)
End Sub

Public Sub PerformClickActions()
    For Each action As Action in _clickActions
        action?.Invoke()
    Next
End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs)
    PerformClickActions()
End Sub

如果你需要在多个地方进行,使用不同类型的事件,似乎很容易为这种事情创建一个通用的泛型类。