Frage

Hintergrundgeschichte: Ich verwende log4net die Protokollierung für ein Projekt zu handhaben ich m arbeiten. Ein spezielles Verfahren kann unter verschiedenen Umständen genannt werden. - einige, die die Log-Meldungen rechtfertigen Fehler und andere sein, dass die Log-Meldungen rechtfertigen Warnungen sein

So, als Beispiel, wie könnte ich drehen

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

In etwas mehr entlang der Linien von:

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

Damit ich es nennen könnte und entweder log.ErrorFormat oder log.WarnFormat als Delegierter passieren?

Ich verwende VB.NET mit VS 2008 und .NET 3.5 SP1. Auch ich bin ziemlich neu für die Delegierten im Allgemeinen, so dass, wenn diese Frage anders formuliert werden soll, um alle Unklarheiten zu entfernen, lassen Sie mich wissen.

EDIT: Auch, wie kann ich die Delegaten initialisieren entweder auf der oder den WarnFormat errorformat im Konstruktor der Klasse? Wäre es so einfach wie myDelegate = log.ErrorFormat sein? Ich könnte mir vorstellen, es gibt mehr zu ihm als das (meine Unwissenheit über das Thema verzeihen - die Delegierten sind wirklich etwas, was ich mehr über, lernen wollen, aber bisher haben sie mein Verständnis entzog)

.
War es hilfreich?

Lösung

Erklären Sie Ihre Delegierten Unterschrift:

Public Delegate Sub Format(ByVal value As String)

Definieren Sie Ihre Testfunktion:

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

Irgendwo im Code rufen Sie Ihre Testfunktion:

CheckDifference(Foo, Bar, AddressOf log.WriteWarn)

oder

CheckDifference(Foo, Bar, AddressOf log.WriteError)

Andere Tipps

Sie werden zunächst einen Delegierten an der Klasse / Modulebene deklarieren möchten (alle dieser Code aus dem Speicher / nicht getestet):

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

Dann .. Sie werden es als eine Eigenschaft Ihrer Klasse beispiels deklarieren möchten.

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

Die Art und Weise der Delegat zu instanziiert ist:

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)

Bitte verzeihen Sie die Formatierung: P

Im Grunde aber, erstellen Sie die Delegierten, die Sie mit der richtigen Signatur werden sollen, und die Adresse an die Methode übergeben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top