Les délégués en tant que paramètres dans VB.NET

voix
7

Backstory: J'utilise log4net pour gérer toute exploitation forestière pour un projet sur lequel je travaille. Une méthode particulière peut être appelée dans plusieurs circonstances différentes - certains qui justifient les messages du journal à des erreurs et d' autres qui justifient les messages du journal à des avertissements.

Ainsi, à 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

Dans quelque chose de plus le long des lignes 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

Alors que je pouvais l'appeler et passer soit log.ErrorFormat ou 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 aux délégués en général, donc si cette question devrait être formulée différemment pour lever toute ambiguïté, laissez-moi savoir.

EDIT: Aussi, comment pourrais - je initialiser le délégué soit à la errorformat ou WarnFormat dans le constructeur de la classe? Serait - il aussi facile que myDelegate = log.ErrorFormat? Je suppose qu'il ya plus que cela (pardonnez mon ignorance sur le sujet - les délégués sont vraiment quelque chose que je veux en savoir plus sur, mais jusqu'à présent , ils ont échappé à ma connaissance).

Créé 22/09/2008 à 22:01
source utilisateur
Dans d'autres langues...                            


4 réponses

voix
0

Vous pouvez passer délégué en tant que paramètre dans VB.NET (et C #). Regardez ici pour un exemple.

Créé 22/09/2008 à 22:04
source utilisateur

voix
0
Public Delegate errorCall(ByVal error As String, Params objs As Objects())
CheckDifference(10, 0, AddressOf log.ErrorFormat)

S'il vous plaît pardonnez la mise en forme: P

Fondamentalement, cependant, créer le délégué que vous voulez, avec la signature correcte, et de transmettre l'adresse de celui-ci à la méthode.

Créé 22/09/2008 à 22:04
source utilisateur

voix
1

Vous voulez d'abord déclarer un délégué au niveau de classe / module (tout ce code est de la mémoire / non testé):

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

Alors .. vous aurez envie de le déclarer comme une propriété à 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 façon de instancier le délégué est:

Dim led as New LogErrorDelegate(AddressOf log.ErrorFormat)
Créé 22/09/2008 à 22:05
source utilisateur

voix
13

Déclarez votre signature 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

Quelque part dans votre code appelez votre fonction de test:

CheckDifference(Foo, Bar, AddressOf log.WriteWarn)

Ou

CheckDifference(Foo, Bar, AddressOf log.WriteError)
Créé 22/09/2008 à 22:11
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more