-1

VB.NET 4 の質問です。

イベント E を含むクラス A が存在するとします。別のクラス (B) では、型 A の変数が WithEvents として宣言されています。A のコード内のある時点で、"RaiseEvent E" コマンドがあります。その後、E が B 内で処理されたかどうかを知る方法はありますか (イベント E のハンドラーがクラス B に存在する場合のみ)。

明らかに、E にはパラメーター (ブール値) を含めることができるため、B 内のハンドラーがそれを処理する場合、このパラメーターを True に設定できます。これは私が求めているものではありません。パラメータを使用せずに、これを達成するための組み込みの.NET方法があるかどうかを知りたいです。

私が回避しようとしているもののコード例(パラメーター DoSomethingWasHandled の使用):

    Public Class A
        Public Event DoSomething(ByRef DoSomethingWasHandled As Boolean)
    
        Public Sub RaiseDoSomething()
            Dim DoSomethingWasHandled As Boolean = False
            RaiseEvent DoSomething(DoSomethingWasHandled)
        End Sub
    End Class
    
    Public Class B
        Public WithEvents SomeA As New A
    
        Private Sub HandleDoSomething(ByRef DoSomethingWasHandled As Boolean) Handles SomeA.DoSomething
            DoSomethingWasHandled = True
        End Sub
    End Class

存在するかどうかを尋ねているコード例:

    Public Class A
        Public Event DoSomething()
    
        Public Sub RaiseDoSomething()
            RaiseEvent DoSomething()
            If DoSomething.WasHandled Then '<-- Does this check exist in any form? ***
                DoSomethingElse()
            End If
        End Sub
    End Class
    
    Public Class B
        Public WithEvents SomeA As New A
    
        Private Sub HandleDoSomething() Handles SomeA.DoSomething
            'DoStuff...
        End Sub
    End Class

*** これは、E のイベント ハンドラがクラス B に存在するかどうかをチェックし、存在する場合は True を返し、存在しない場合は False を返します。

4

1 に答える 1

0

このような。

Public Class A
    Public Event DoSomething(e As Object)

    Public Sub RaiseDoSomething()
        ' adding 'Event' to the variable name of
        '  the event allows it to be checked
        If DoSomethingEvent IsNot Nothing Then 'does the event have a subscriber(Event Handler)?
            'yes
            RaiseEvent DoSomething("TEST") 'because there is a handler this will be handled
        End If
    End Sub
End Class

Public Class B
    Public WithEvents SomeA As New A

    Private Sub HandleDoSomething(e As Object) Handles SomeA.DoSomething
        Debug.WriteLine("Do")
    End Sub
End Class

テスト

    Dim FOOa As New A
    Dim fooB As New B

    FOOa.RaiseDoSomething()
    fooB.SomeA.RaiseDoSomething()
于 2021-10-26T18:17:14.977 に答える