Вопрос

Предыстория:я использую 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?Я предполагаю, что это нечто большее (простите за мое невежество в этом вопросе - делегаты - это действительно то, о чем я хочу узнать больше, но до сих пор они ускользали от моего понимания).

Это было полезно?

Решение

Объявите подпись делегата:

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)

Другие советы

Сначала вам нужно объявить делегата на уровне класса/модуля (весь этот код взят из памяти/не тестировался):

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)
Public Delegate errorCall(ByVal error As String, Params objs As Objects())
CheckDifference(10, 0, AddressOf log.ErrorFormat)

Пожалуйста, простите за форматирование :P

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top