Imports System.Reflection ''' ''' A Simple EventBus for .NET ''' https://stackoverflow.com/questions/368265/a-simple-event-bus-for-net ''' Public Class EventBus Private Shared _Instance As EventBus Private _Listeners As List(Of EventListenerWrapper) = New List(Of EventListenerWrapper)() Public Shared ReadOnly Property Instance As EventBus Get If IsNothing(_Instance) Then _Instance = New EventBus() End If Return _Instance End Get End Property ''' ''' Register a form as an event listener. ''' ''' The event listener, usually `Me` Public Sub Register(ByVal listener As Object) If Not _Listeners.Any(Function(l) l.Listener.Equals(listener)) Then _Listeners.Add(New EventListenerWrapper(listener)) End If End Sub Public Sub Unregister(ByVal listener As Object) Try _Listeners.RemoveAll(Function(l) l.Listener = listener) Catch ex As Exception End Try End Sub Public Sub PostEvent(ByVal e As Object) _Listeners. Where(Function(l) l.EventType = e.[GetType]()). ToList(). ForEach(Sub(l) l.PostEvent(e)) End Sub Private Class EventListenerWrapper Public Property Listener As Object Public Property EventType As Type Private _method As MethodBase Public Sub New(ByVal listener As Object) Me.Listener = listener Dim oType As Type = listener.[GetType]() _method = oType.GetMethod("OnEvent") If _method Is Nothing Then Throw New ArgumentException("Class " & oType.Name & " does not containt method OnEvent") End If Dim oParameters As ParameterInfo() = _method.GetParameters() If oParameters.Length <> 1 Then Throw New ArgumentException("Method OnEvent of class " & oType.Name & " have invalid number of parameters (should be one)") End If EventType = oParameters(0).ParameterType End Sub Public Sub PostEvent(ByVal e As Object) _method.Invoke(Listener, {e}) End Sub End Class End Class