VB.NET のパラメータとしてのデリゲート
質問
バックストーリー:使っています ログフォーネット 私が取り組んでいるプロジェクトのすべてのログを処理するため。ある特定のメソッドは、いくつかの異なる状況下で呼び出すことができます。ログ メッセージがエラーであることが保証されるメソッドもあれば、ログ メッセージが警告であることが保証されるメソッドもあります。
それで、例として、どうすれば回転できますか
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
?それ以上の意味があるのではないかと想像します (この件に関して私の無知をご容赦ください。デリゲートについては本当に詳しく知りたいのですが、今のところ私の理解は得られていません)。
解決
デリゲートの署名を宣言します。
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
ただし、基本的には、正しい署名を使用して必要なデリゲートを作成し、そのアドレスをメソッドに渡します。