我有以下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
。
我完全控制了代码,所以如果有更好的方法可以解决这个问题,我会对此持开放态度。目标是我们可以有几十种类型的消息,我只是希望能够在发送失败的情况下将它们排队。
谢谢!
答案 0 :(得分: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
如果需要为每种消息类型实现不同的发布,那么它会变得有点混乱。你必须使用GetType()来计算 它是什么类型的消息类,然后调用适当的代码。如果是这种情况,那么我就不会使用Generics作为通用方法 通常用于不同类型之间的共享功能。其中一个例子是Dictionary Class。它不关心它是否a 对象列表或消息列表,字典功能是相同的。