Question

Histoire: j'utilise log4net pour gérer toute la journalisation d'un projet I ' m travaille sur. Une méthode particulière peut être appelée dans plusieurs circonstances différentes: certaines qui garantissent que les messages du journal sont des erreurs et d’autres qui garantissent que les messages du journal sont des avertissements.

Alors, à titre d'exemple, comment pourrais-je tourner

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

En quelque chose de plus dans le sens 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

Pour que je puisse l'appeler et passer soit log.ErrorFormat, soit log.WarnFormat en tant que délégué?

J'utilise VB.NET avec VS 2008 et .NET 3.5 SP1. De plus, je suis assez nouveau pour les délégués en général, alors si cette question doit être formulée différemment pour lever les ambiguïtés, faites-le-moi savoir.

EDIT: De plus, comment pourrais-je initialiser le délégué à ErrorFormat ou à WarnFormat dans le constructeur de classe? Serait-ce aussi simple que myDelegate = log.ErrorFormat ? J'imagine qu'il y a plus que cela (excusez mon ignorance sur le sujet - les délégués sont vraiment quelque chose sur lequel je veux en savoir plus, mais jusqu'à présent, ils ont échappé à ma compréhension).

Était-ce utile?

La solution

Déclarez la signature de votre délégué:

Public Delegate Sub Format(ByVal value As String)

Définissez votre fonction de test:

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

Dans votre code, appelez votre fonction de test:

CheckDifference(Foo, Bar, AddressOf log.WriteWarn)

Ou

CheckDifference(Foo, Bar, AddressOf log.WriteError)

Autres conseils

Vous voudrez d’abord déclarer un délégué au niveau de la classe / du module (tout ce code provient de la mémoire / n’a pas été testé):

Private Delegate Sub LogErrorDelegate(txt as string, byval paramarray fields() as string)

Ensuite, vous voudrez le déclarer comme une propriété de votre classe, par exemple.

Private _LogError
Public Property LogError as LogErrorDelegate
  Get 
    Return _LogError
  End Get
  Set(value as LogErrorDelegate)
    _LogError = value
  End Set
End Property

La manière d'instancier le délégué est la suivante:

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)

S'il vous plaît oubliez le formatage: P

Cependant, créez le délégué que vous souhaitez, avec la signature correcte, et transmettez son adresse à la méthode.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top