2

我有以下通用类:

public class MessageProcesser<T> where T : Message

在代码中,我具有以下属性:

private readonly BlockingCollection<T> _messages;

当我尝试这样做时,我得到一个错误(因为 T 是一条消息,它应该是可能的):

_messages.Add(new Message(MessageType.Stop));

怎么了?

谢谢!

4

2 回答 2

4

您没有消息集合。消息不能是 T,因为 T 可能已被继承。

尝试

private readonly BlockingCollection<Message> _messages;
于 2012-06-14T07:48:32.397 回答
3

编译器错误是您假设T始终为Message. T可能是更派生的类型,例如DerivedMessage : Message. 这将使您的 collection BlockingCollection<DerivedMessage>,尝试将一个实例设置Message为 this 将是无效的。

如果您想包含所有类型的所有消息的列表,您需要做的就是:

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创建责任传递给工厂。MessageProcessor

于 2012-06-14T07:55:44.623 回答