【问题标题】:VB.net Class event that raises when a shared function is called from another class/object?从另一个类/对象调用共享函数时引发的 VB.net 类事件?
【发布时间】:2021-09-09 11:55:52
【问题描述】:

如何创建或使用从另一个对象或类调用共享子/函数时引发的事件?

我将展示一个示例: 我有访问数据库的 DataHost 类:

Class DataHost

Shared Sub addName().....
Shared Sub delName().....
Shared Function getNames()....

Shared Function askPassword()........

End Class

我希望程序在每次另一个类调用 DataHost 的子/函数来访问数据库时询问密码。

我可以在每个函数的开头添加if askpass()=False Then return,但在我的代码中,函数超过了 20 个,我希望有一个更智能的解决方案。

所以我正在寻找在您调用另一个子/函数时调用 askPassword() 的东西。

【问题讨论】:

  • 共享活动怎么样?

标签: vb.net function events


【解决方案1】:

好吧,这可能根本不是您所要求的,但我将发布共享事件的代码,然后您可以查看是否可以以任何方式使用它。 (这是我的日志事件,所以请忽略命名)

Public Class Logging
    Public Shared Event LogEvent As EventHandler
    Public Shared Sub OnLogWrite(ByVal Sender As Object)
        RaiseEvent LogEvent(Sender, New EventArgs)
    End Sub
End Class

这是您必须收听的共享事件。您可以在任何地方向 LogEvent 添加处理程序。它将获取对此的所有调用。在这里,您将能够创建一个跟踪 Sender 值的共享变量。例如一个 List(of Object)。

您在任何地方引发事件(除了在 Shared 方法或函数内,因为没有实例):

Logging.OnLogWrite(Me)

您可以在任何地方收听活动:

AddHandler Logging.LogEvent, AddressOf HandleLogEvent

HandleLogEvent 的代码如下所示:

Private Sub HandleLogEvent()
    MessageBox.Show("Hello.")
End Sub

HandleLogEvent 例如可以重命名为 askPassword。这意味着如果没有在 OnLogWrite Sub 中进行检查。然后任何时候调用事件,askPassword 都会被执行。希望这对您有所帮助。

【讨论】:

    【解决方案2】:

    我建议不要对所有函数使用共享方法,只允许通过实例调用它们。然后限制实例化(构造函数)过程。快速示例:

    Class DataHost
        Shared Function GetHost() As DataHost
            If askPassword() Then
                Return New DataHost()
            End If
    
            ' Or do something else instead of throw nothing
            Return Nothing
        End Function
    
        Shared Function askPassword() As Boolean
            ' ask for password?
        End Function
    
        ''' <summary>
        ''' Private constructor to avoid external instantiation - thus force external calls to go through factory: GetHost()
        ''' </summary>
        ''' <remarks></remarks>
        Private Sub New()
        End Sub
    
        Sub addName()
    
        End Sub
    
    
        Sub delName()
    
        End Sub
    
        Function getNames() As IEnumerable(Of String)
    
        End Function
    
    End Class
    

    这里可以看到调用GetNames(),调用者必须有DataHost的实例,但是由于私有构造函数,调用者必须通过工厂方法GetHost()获取DataHost的实例。

    如果您不想拥有多个 DataHost 副本,您也可以使用单例,并在提供密码时在 GetHost() 方法中将其返回。

    编辑: 如果你真的想在这个过程中引发一个事件,你也可以在 GetHost 方法中这样做: 在DataHost中创建一个私有方法来引发事件,然后在DataHost被实例化后,调用它来抛出事件:

        Shared Function GetHost() As DataHost
            If askPassword() Then
                dim host = New DataHost()
                host.RaiseSomeEvent() 
            End If
    
            ' Or do something else instead of throw nothing
            Return Nothing
        End Function
    

    然后可以在外部订阅和处理该事件。

    • 根据您的需要进行调整。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多