9

背景故事:我正在使用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 一起使用。此外,我对代表们一般来说还很陌生,所以如果这个问题应该用不同的措辞来消除任何歧义,请告诉我。

编辑:另外,我如何在类构造函数中将委托初始化为 ErrorFormat 或 WarnFormat?会那么容易myDelegate = log.ErrorFormat吗?我想还有更多的东西(请原谅我对这个主题的无知——代表确实是我想了解更多的东西,但到目前为止他们还没有理解我的理解)。

4

3 回答 3

15

声明您的代表签名:

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

在您的代码中的某处调用您的 Test 函数:

CheckDifference(Foo, Bar, AddressOf log.WriteWarn)

或者

CheckDifference(Foo, Bar, AddressOf log.WriteError)
于 2008-09-22T21:11:09.920 回答
1

您首先要在类/模块级别声明一个委托(所有这些代码都来自内存/未经测试):

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)
于 2008-09-22T21:05:58.873 回答
0
Public Delegate errorCall(ByVal error As String, Params objs As Objects())
CheckDifference(10, 0, AddressOf log.ErrorFormat)

请原谅格式:P

不过,基本上,使用正确的签名创建您想要的委托,并将其地址传递给方法。

于 2008-09-22T21:04:47.893 回答