Delegierten als Parameter in VB.NET
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)
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.