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 回答