2012-08-15 43 views
0

我有以下VB.NET代碼:.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

我從來沒有編碼VB,但我知道一些其他語言。 '私人_retryMessages作爲字典(的類型,列表(對象))'告訴我你的'_retryMessages'字段將返回一個'對象'。在不改變你的設計的情況下,我認爲你需要從你的'Publish'方法中取出'(Of T)'並且使它(猜測語法)'Private Sub Publish(消息作爲Object,類型爲Type)'並且調用它像'Publish(message,message.GetType())'(假設'GetType()'是一個方法)。 – 2012-08-15 20:41:38

+0

當然,如果你這樣做,那麼就沒有必要爲'RetryMessage.'提供泛型參數。讓我問你:你是在爲'T'創建類,還是在使用其他類型的類?如果你正在製作它們,我會推薦使用接口,而如果VB處理這些接口,則會推薦使用泛型約束。如果你讓我知道,我會解釋如何做到這一點。 * – 2012-08-15 20:46:46

+0

*將返回'對象'的'List'。 – 2012-08-15 20:47:19

回答

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 

如果發佈需要針對每個消息類型以不同的方式實現,那麼它會得到一些m essier。您將不得不使用GetType()來確定它是什麼類型的消息類,然後調用相應的代碼來確定 。如果是這種情況,那麼我不會使用泛型,因爲泛型方法 通常用於不同類型之間的共享功能。其中一個例子是Dictionary Class。它不關心其對象列表或消息列表是否與字典功能相同。