Delegates as parameters in VB.NET

梦想的初衷 提交于 2020-01-01 09:03:25

问题


Backstory: I'm using log4net to handle all logging for a project I'm working on. One particular method can be called under several different circumstances -- some that warrant the log messages to be errors and others that warrant the log messages to be warnings.

So, as an example, how could I turn

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

Into something more along the lines of:

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

So that I could call it and pass either log.ErrorFormat or log.WarnFormat as the delegate?

I'm using VB.NET with VS 2008 and .NET 3.5 SP1. Also, I'm fairly new to delegates in general, so if this question should be worded differently to remove any ambiguities, let me know.

EDIT: Also, how could I initialize the delegate to either the ErrorFormat or the WarnFormat in the class constructor? Would it be as easy as myDelegate = log.ErrorFormat? I would imagine there is more to it than that (pardon my ignorance on the subject -- delegates are really something I want to learn more about, but so far they have eluded my understanding).


回答1:


Declare your delegate signature:

Public Delegate Sub Format(ByVal value As String)

Define your Test function:

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

Somewhere in your code call your Test function:

CheckDifference(Foo, Bar, AddressOf log.WriteWarn)

Or

CheckDifference(Foo, Bar, AddressOf log.WriteError)



回答2:


You'll first want to declare a delegate at the Class/Module level (all this code is from memory/not tested):

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

Then .. you'll want to declare it as a property to your class e.g.

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

The way to instantiate the delegate is:

Dim led as New LogErrorDelegate(AddressOf log.ErrorFormat)



回答3:


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

Please forgive the formatting :P

Basically though, create the delegate that you want, with the correct signature, and pass the address of it to the method.



来源:https://stackoverflow.com/questions/117623/delegates-as-parameters-in-vb-net

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!