.NET - 使用Type调用通用方法或在运行时进行转换

时间:2012-08-15 20:34:50

标签: .net vb.net

我有以下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

我完全控制了代码,所以如果有更好的方法可以解决这个问题,我会对此持开放态度。目标是我们可以有几十种类型的消息,我只是希望能够在发送失败的情况下将它们排队。

谢谢!

1 个答案:

答案 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 对象列表或消息列表,字典功能是相同的。