Delegados como parâmetros em VB.NET
Pergunta
Histórico: Estou usando log4net para lidar com todo o registro de um projeto que eu' m trabalhando. Um método particular pode ser chamado em várias circunstâncias diferentes -. Alguns que garante as mensagens de log para ser erros e outros que merecem as mensagens de log para ser advertências
Assim, como exemplo, como eu poderia transformar
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
Em algo mais ao longo das linhas de:
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
Assim que eu poderia chamá-lo e passar tanto log.ErrorFormat ou log.WarnFormat como delegado?
Eu estou usando VB.NET com o VS 2008 e .NET 3.5 SP1. Além disso, eu sou bastante novo para os delegados, em geral, por isso, se esta questão deve ser redigida de forma diferente para remover quaisquer ambiguidades, deixe-me saber.
EDIT: Além disso, como eu poderia inicializar o delegado, quer ao ErrorFormat ou o WarnFormat no construtor da classe? Seria tão fácil como myDelegate = log.ErrorFormat
? Eu imagino que há mais do que isso (perdão a minha ignorância sobre o assunto - os delegados são realmente algo que eu quero saber mais sobre, mas até agora eles têm iludiu meu entendimento).
Solução
Declare sua assinatura do delegado:
Public Delegate Sub Format(ByVal value As String)
Definir a função de teste:
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
Em algum lugar em seu código chamar sua função de teste:
CheckDifference(Foo, Bar, AddressOf log.WriteWarn)
ou
CheckDifference(Foo, Bar, AddressOf log.WriteError)
Outras dicas
Você vai querer primeiro declarar um delegado ao nível Classe / Module (todo este código é a partir da memória / não testado):
Private Delegate Sub LogErrorDelegate(txt as string, byval paramarray fields() as string)
Então .. você vai querer declará-lo como uma propriedade para a sua classe por exemplo.
Private _LogError
Public Property LogError as LogErrorDelegate
Get
Return _LogError
End Get
Set(value as LogErrorDelegate)
_LogError = value
End Set
End Property
A maneira de instanciar o delegado é:
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)
Por favor, perdoe a formatação: P
Basicamente, porém, criar o delegado que você quer, com a assinatura correta, e passar o endereço dela para o método.