コンパイラ エラーは、T
常にMessage
. T
のような、より派生した型である可能性があります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);
引数を使用してコンストラクターを制約することはできないため、現在のコンストラクターの使用はサポートされません。MessageFactory
これを回避する方法は、aをに渡し、作成の責任をファクトリにMessageProcessor
抽象化することです。