2012-06-14 17 views

回答

4

您沒有收集消息。消息不能是T,因爲T可能已被繼承。

嘗試

private readonly BlockingCollection<Message> _messages; 
+1

+1事實上,換句話說,儘管OP指出「哪裏T:消息」。 'T'可能是'DerivedMessage:Message',所以將'Message'添加到'BlockingCollection '是無效的。然而,將'DerivedMessage'添加到'BlockingCollection '是有效的,也許是OP試圖做的。 –

+0

謝謝,你是對的。 MessageProcessor應該處理消息,而不是T。 –

3

的編譯器錯誤的事實是,你承擔T總是MessageT可能是更衍生的類型,如DerivedMessage : Message。這會使你的收藏BlockingCollection<DerivedMessage>,試圖將Message的實例設置爲這個無效。

如果要包含所有郵件列表無論哪種類型,所有你需要做的是:

private readonly BlockingCollection<Message> _messages; 

而且完全刪除使用泛型。然後,您可以存儲Message類型以及從Message派生的任何類型。

如果你想擁有MessageProcessor<T>處理任何信息,並存儲正確,相關類型,你總是可以使用new()約束強制類型有公共的無參數構造:

public class MessageProcesser<T> where T : Message, new() 

然後你可以或許做到這一點:

var message = new T(); 
message.MessageType = MessageType.Stop; 
_messages.Add(message); 

不能合作nstrain在帶參數的構造函數上,所以你當前的構造函數使用不會被支持。一種方法是通過MessageFactoryMessageProcessor摘要創建責任到工廠。

+0

我也可以接受你的答案......頁面上的另一個更高:P –

+0

@SoMoS完全由你決定,我不是f::-)我只是試圖補充他的答案進一步的細節。 –

相關問題