.net 处理当前类之外的事件

.net 处理当前类之外的事件,.net,vb.net,events,.net,Vb.net,Events,我正在编写一个具有许多基于事件而不是显式调用的功能的应用程序。我已经实现了一个名为EventHost的事件“通知程序”,它会引发某些感兴趣的事件,我希望我的应用程序中的任何功能都能够“订阅”并响应他们关心的EventHost中的事件。下面是一些伪代码,演示了我所追求的: Module Globals Public WithEvents MyEventHost As EventHost End Module Class MyCoolFeature1 Shared Sub Even

我正在编写一个具有许多基于事件而不是显式调用的功能的应用程序。我已经实现了一个名为
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字段,这只能通过在我的功能本身之外的应用程序中的其他地方编写额外代码来完成。可以显式地实例化internal WithEvents字段(比如说
myColFeature1.EventHost=MyEventHost
),或者使用类似的内容,这需要向事件主机注册每个新功能

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

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


是否有某种方法可以直接将类中的方法订阅到外部事件引发器,而不需要额外的外部代码将其“连接”到所述事件引发器?如果必要的话,我很乐意使用一些设计模式或技术,而不是使用.NET的股票事件。

除非在同一类型中有一个字段声明为
with Events
,它显然不是模块事件或类的
共享
事件的选项,否则不能使用
句柄。您别无选择,只能使用
AddHandler
语句。放在哪里取决于您自己,但在常规类中,您可能会在无参数构造函数中执行此操作:

公共模块
公共事件SomeEvent作为事件处理程序
端模块
公共类SomeClass
公共亚新
AddHandler SomeModule.SomeEvent,SomeModule\u SomeEvent的地址
端接头
私有子SomeModule_SomeEvent(发送方作为对象,e作为事件参数)
'...
端接头
末级

完美,这很有道理。我假设AddHandler也有同样的限制,但你是对的,它没有。谢谢。@DRoam,在C#中,只有一种方法可以附加事件处理程序:使用
+=
操作符。VB
AddHandler
语句与之等效。VB
句柄
关键字特定于VB。这是不同的,因为事件处理程序与字段而不是对象相关联。如果将不同的对象分配给声明为
的字段WithEvents
,则该方法现在处理该新对象的事件。这就是魔力的来源。VB正在幕后完成将事件处理程序从一个对象分离并附加到另一个对象的工作。