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).

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top