Вопрос по log4net, lambda, delegates, vb.net – Делегаты в качестве параметров в VB.NET

7

Предыстория: я используюlog4net обрабатывать все журналы для проекта, над которым я работаю. Один конкретный метод может быть вызван при нескольких различных обстоятельствах - некоторые, которые гарантируют сообщения журнала, чтобы быть ошибками, и другие, которые гарантируют сообщения журнала, чтобы быть предупреждениями.

Итак, как пример, как я мог повернуть

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

Во что-то более похожее на:

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

Чтобы я мог вызвать его и передать в качестве делегата log.ErrorFormat или log.WarnFormat?

Я использую VB.NET с VS 2008 и .NET 3.5 SP1. Кроме того, я довольно новичок для делегатов в целом, поэтому, если этот вопрос следует сформулировать по-другому, чтобы устранить двусмысленность, дайте мне знать.

РЕДАКТИРОВАТЬ: Кроме того, как я мог инициализировать делегат либо ErrorFormat или WarnFormat в конструкторе класса? Будет ли это так же просто, какmyDelegate = log.ErrorFormat? Я полагаю, что в этом есть нечто большее (извините за мое невежество по этому вопросу - я действительно хочу узнать больше о делегатах, но пока они ускользали от моего понимания).

Ваш Ответ

4   ответа
0

отритеВот для примера.

13

Public Delegate Sub Format(ByVal value As String)

Определите свою функцию теста:

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

Где-то в вашем коде вызовите функцию Test:

CheckDifference(Foo, Bar, AddressOf log.WriteWarn)

Или же

CheckDifference(Foo, Bar, AddressOf log.WriteError)
1

этот код взят из памяти / не проверен):

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

Затем ... вы хотите объявить его как свойство для вашего класса, например

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

Способ создания экземпляра делегата:

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

Тем не менее, в принципе, создайте нужный делегат с правильной подписью и передайте его адрес методу.

Похожие вопросы