背景故事:我使用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
? 我会想象有更给它比(原谅关于这个问题我的无知 - 代表是真的东西,我想更多地了解,但到目前为止,他们已经躲过我的理解)。
声明你的委托签名:
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)
您首先需要在类图/模块级中声明一个委托(所有这些代码是从内存/未测试):
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)
Public Delegate errorCall(ByVal error As String, Params objs As Objects())
CheckDifference(10, 0, AddressOf log.ErrorFormat)
请原谅的格式:P
但是基本上,创造您想要的委托,用正确的签名,它的地址传递给方法。