Делегаты в качестве параметров в VB.NET - PullRequest
8 голосов
/ 23 сентября 2008

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

Ответы [ 3 ]

14 голосов
/ 23 сентября 2008

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

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

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

CheckDifference(Foo, Bar, AddressOf log.WriteWarn)

или

CheckDifference(Foo, Bar, AddressOf log.WriteError)
1 голос
/ 23 сентября 2008

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

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 голосов
/ 23 сентября 2008
Public Delegate errorCall(ByVal error As String, Params objs As Objects())
CheckDifference(10, 0, AddressOf log.ErrorFormat)

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...