operator net method expressions examples delegate vb.net delegates lambda log4net

method - Delegados como parámetros en VB.NET



lambda expressions vb.net examples (4)

Antecedentes: estoy usando log4net para manejar todos los registros de un proyecto en el que estoy trabajando. Se puede invocar un método en particular bajo diferentes circunstancias, algunas que garantizan que los mensajes de registro son errores y otros que garantizan que los mensajes de registro sean advertencias.

Entonces, como un ejemplo, ¿cómo podría volverme

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 algo más parecido a:

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

¿Para poder llamarlo y pasar log.ErrorFormat o log.WarnFormat como delegado?

Estoy usando VB.NET con VS 2008 y .NET 3.5 SP1. Además, soy bastante nuevo para los delegados en general, por lo que si esta pregunta debe redactarse de forma diferente para eliminar cualquier ambigüedad, házmelo saber.

EDITAR: Además, ¿cómo podría inicializar el delegado a ErrorFormat o WarnFormat en el constructor de la clase? ¿Sería tan fácil como myDelegate = log.ErrorFormat ? Me imagino que hay algo más que eso (perdón por mi ignorancia sobre el tema - los delegados son realmente algo de lo que quiero aprender más, pero hasta ahora han eludido mi comprensión).


Declara la firma de tu delegado:

Public Delegate Sub Format(ByVal value As String)

Defina su función de prueba:

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

En algún lugar de tu código, llama a tu función Test:

CheckDifference(Foo, Bar, AddressOf log.WriteWarn)

O

CheckDifference(Foo, Bar, AddressOf log.WriteError)


Primero querrá declarar un delegado en el nivel Clase / Módulo (todo este código es de memoria / no probado):

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

Entonces ... querrás declararlo como propiedad de tu clase, por ej.

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

La forma de crear instancias del delegado es:

Dim led as New LogErrorDelegate(AddressOf log.ErrorFormat)


Puede pasar delegate como parámetro en VB.NET (y C #). Mire aquí para un ejemplo.


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

Por favor perdone el formato: P

Básicamente, cree el delegado que desee, con la firma correcta, y pase la dirección del mismo al método.