Делегаты как параметры в VB.NET
Вопрос
Предыстория:я использую 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
?Я предполагаю, что это нечто большее (простите за мое невежество в этом вопросе - делегаты - это действительно то, о чем я хочу узнать больше, но до сих пор они ускользали от моего понимания).
Решение
Объявите подпись делегата:
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)
Другие советы
Сначала вам нужно объявить делегата на уровне класса/модуля (весь этот код взят из памяти/не тестировался):
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
Однако по сути создайте нужный вам делегат с правильной подписью и передайте его адрес методу.