9

バックストーリー: 現在取り組んでいるプロジェクトのすべてのロギングを処理するために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 のいずれかをデリゲートとして渡すことができるようにするには?

VS 2008 および .NET 3.5 SP1 で VB.NET を使用しています。また、私は一般的にデリゲートにはかなり慣れていないので、あいまいさを取り除くためにこの質問を別の言葉で表現する必要がある場合は、お知らせください。

編集: また、クラス コンストラクターでデリゲートを ErrorFormat または WarnFormat に初期化するにはどうすればよいですか? それは簡単myDelegate = log.ErrorFormatですか?それ以上のことがあると思います (この件に関する私の無知を許してください - デリゲートは本当に私がもっと学びたいものですが、これまでのところ私の理解を逃れています)。

4

3 に答える 3

15

委任署名を宣言します。

Public Delegate Sub Format(ByVal value As String)

Test 関数を定義します。

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)
于 2008-09-22T21:11:09.920 に答える
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)
于 2008-09-22T21:05:58.873 に答える
0
Public Delegate errorCall(ByVal error As String, Params objs As Objects())
CheckDifference(10, 0, AddressOf log.ErrorFormat)

フォーマットを許してください:P

ただし、基本的には、必要なデリゲートを正しい署名で作成し、そのアドレスをメソッドに渡します。

于 2008-09-22T21:04:47.893 に答える