0

次の VB.NET コードがあります。

Private _retryMessages as Dictionary(Of Type, List(Of Object))

Private Sub RetryMessage(Of T)(message as T)
    _retryMessages(GetType(T)).Add(message)
End Sub

Private Sub Publish(Of T)(message as T)
    ' code to publish message -- dependent on T
End Sub

Publish辞書を反復処理して各メッセージを呼び出す新しいメソッドを作成したいと思います。

Private Sub AttemptRetryMessages()
    For Each messageType In _retryMessages.Keys
        messages = _retryMessages(messageType)
        ' now I'm lost ...
        'For Each message In messages
        '    Publish(message) '<-- System.Object
        'Next
    Next
End Sub

問題は、私が型を持っていることですがPublish、ジェネリックに適切な型を提供する方法がわかりません。そのまま呼び出すと、Tと解釈されSystem.Objectます。

私はコードを完全に制御しているので、これを行うためのより良い方法があれば、私はそれを受け入れます. 目標は、数十種類のメッセージを持つことができるようにすることです。送信が失敗した場合に備えて、それらをキューに入れられるようにしたいだけです。

ありがとう!

4

1 に答える 1

0

パブリッシュがすべてのメッセージ タイプで同じである場合は、次の手順を実行します。

1: 他のメッセージ クラスが継承する基本クラスを作成します。

Public Class Message

    Public Sub Publish()
        'Implementation Omitted
    End Sub

End Class

2: 既存のコードをいくつか変更します。

Private _retryMessages as Dictionary(Of Type, List(Of Message))

3: 最後に AttemptRetryMessages() は次のようになります。

Private Sub AttemptRetryMessages() 

    For Each messageList As List(Of Message) In _retryMessages.Values 
        For Each m As Message in messageList
            messageType.Publish()
        Next
    Next

End Sub

メッセージ タイプごとに Publish を異なる方法で実装する必要がある場合は、少し面倒になります。GetType() を使用してメッセージ クラスの種類を特定し、適切なコードを呼び出す必要があります。この場合、ジェネリック メソッドは通常、異なる型間で共有される機能に使用されるため、ジェネリックは使用しません。その例は辞書クラスです。オブジェクトのリストであろうとメッセージのリストであろうと、辞書の機能は同じです。

于 2012-08-15T21:11:28.330 に答える