代表们在VB.NET参数(Delegates as parameters in VB.NET)

2019-07-30 17:30发布

背景故事:我使用log4net的处理所有记录的项目我的工作。 一些保证日志消息是错误和其他人保证日志消息是警告 - 一种特殊的方法可以在几种不同的情况下被调用。

所以,作为一个例子,我怎么可能把

Public Sub CheckDifference(ByVal A As Integer, ByVal B As Integer)
  If (B - A) > 5 Then
    log.ErrorFormat("Difference ({0}) is outside of acceptable range.", (B - A))
  End If
End Sub

弄成沿的线条更:

Public Sub CheckDifference(ByVal A As Integer, ByVal B As Integer, "Some delegate info here")
  If (B - A) > 5 Then
    **delegateinfo**.Invoke("Difference ({0}) is outside of acceptable range.", (B - A))
  End If
End Sub

这样我就可以把它和通过其中log.ErrorFormat或log.WarnFormat作为代表?

我使用VB.NET在VS 2008和.NET 3.5 SP1。 另外,我是相当新的一般代表,因此,如果这个问题要不同的措词,以消除任何含糊之处,让我知道。

编辑:另外,我怎么能初始化委托无论是错误格式运用于还是在类的构造函数的WarnFormat? 难道是一样简单myDelegate = log.ErrorFormat ? 我会想象有更给它比(原谅关于这个问题我的无知 - 代表是真的东西,我想更多地了解,但到目前为止,他们已经躲过我的理解)。

Answer 1:

声明你的委托签名:

Public Delegate Sub Format(ByVal value As String)

定义你的测试功能:

Public Sub CheckDifference(ByVal A As Integer, _
                           ByVal B As Integer, _
                           ByVal format As Format)
    If (B - A) > 5 Then
        format.Invoke(String.Format( _
        "Difference ({0}) is outside of acceptable range.", (B - A)))
    End If
End Sub

某处在你的代码中调用你的测试功能:

CheckDifference(Foo, Bar, AddressOf log.WriteWarn)

要么

CheckDifference(Foo, Bar, AddressOf log.WriteError)


Answer 2:

您首先需要在类图/模块级中声明一个委托(所有这些代码是从内存/未测试):

Private Delegate Sub LogErrorDelegate(txt as string, byval paramarray fields() as string)

然后..你会希望将其声明为一个属性类如

Private _LogError
Public Property LogError as LogErrorDelegate
  Get 
    Return _LogError
  End Get
  Set(value as LogErrorDelegate)
    _LogError = value
  End Set
End Property

实例委托的方式是:

Dim led as New LogErrorDelegate(AddressOf log.ErrorFormat)


Answer 3:

Public Delegate errorCall(ByVal error As String, Params objs As Objects())
CheckDifference(10, 0, AddressOf log.ErrorFormat)

请原谅的格式:P

但是基本上,创造您想要的委托,用正确的签名,它的地址传递给方法。



文章来源: Delegates as parameters in VB.NET