【问题标题】:Handle an event outside the current class处理当前类之外的事件
【发布时间】:2021-01-07 22:33:04
【问题描述】:

我正在编写一个具有许多基于事件而不是显式调用的功能的应用程序。我已经实现了一个名为EventHost 的事件“通知程序”,它引发了某些感兴趣的事件,我希望我的应用程序中的任何功能都能够“订阅”并响应他们关心的EventHost 中的事件.下面是一些演示我所追求的伪代码:

Module Globals
    Public WithEvents MyEventHost As EventHost
End Module

Class MyCoolFeature1
    Shared Sub EventXHandler() Handles Globals.EventHost.EventX
        ' Do cool stuff...
    End Sub
End Class

' And likewise for any number of new features.

问题是,正如我得到的错误所示,“Handles 子句需要在 包含类型或其基本类型之一中定义 WithEvents 变量。”

我熟悉如何以这种方式使用事件,在类本身中使用 WithEvents 字段。但是,这需要在某个时候实例化 WithEvents 字段,这只能通过在我的功能本身之外编写额外的代码,在应用程序的其他地方来完成。内部 WithEvents 字段可以显式实例化(通过类似 MyCoolFeature1.EventHost = MyEventHost 的方式),或使用类似 observer pattern 的方式,这需要向 Event Host 注册每个新功能。

我想要做的是避免这个“注册”步骤。这只是一个可能被遗忘的额外步骤,似乎没有必要。似乎像EventHost 这样的事件引发者应该可以简单地“广播”其事件,而像MyCoolFeature1 这样的事件监听器应该可以简单地“订阅”事件引发者。这样,开发人员就可以创建新功能并让他们处理他们关心的全局 EventHost 中的事件,就这样吧。

但是,由于“WithEvents 变量必须在同一个类中”的限制,这似乎是不可能的。似乎创建功能必须是一个两步过程:1. 使用“Handles”子句对功能的类和方法进行编码,2. 在我的应用程序的其他位置“注册”该功能作为EventHost 的侦听器.

有什么方法可以简单地将我的类中的方法直接订阅到外部事件引发器,而不需要额外的外部代码来“连接”到所述事件引发器?如果有必要,我会很高兴使用一些使用 .NET 的股票事件以外的东西的设计模式或技术。

【问题讨论】:

    标签: .net vb.net events


    【解决方案1】:

    您不能使用Handles,除非在同一类型中声明了WithEvents 的字段,这显然不是模块事件或类Shared 事件的选项。您别无选择,只能使用AddHandler 语句。你把它放在哪里取决于你,但是,在一个普通的类中,你可能会在一个无参数的构造函数中这样做:

    Public Module SomeModule
    
        Public Event SomeEvent As EventHandler
    
    End Module
    
    Public Class SomeClass
    
        Public Sub New
            AddHandler SomeModule.SomeEvent, AddressOf SomeModule_SomeEvent
        End Sub
    
        Private Sub SomeModule_SomeEvent(sender As Object, e As EventArgs)
            '...
        End Sub
    
    End Class
    

    【讨论】:

    • 完美,有道理。我假设 AddHandler 会有同样的限制,但你是对的,它没有。谢谢。
    • @DRoam,在 C# 中,只有一种方法可以附加事件处理程序:使用 += 运算符。 VB AddHandler 语句与此等价。 VB Handles 关键字特定于 VB。这是不同的,因为事件处理程序与字段而不是对象相关联。如果您将不同的对象分配给声明为WithEvents 的字段,则该方法现在处理该新对象的事件。这就是神奇之处。VB 正在幕后工作,将事件处理程序与一个对象分离并将其附加到另一个对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多