我有以下通用类:
public class MessageProcesser<T> where T : Message
在代码中,我具有以下属性:
private readonly BlockingCollection<T> _messages;
当我尝试这样做时,我得到一个错误(因为 T 是一条消息,它应该是可能的):
_messages.Add(new Message(MessageType.Stop));
怎么了?
谢谢!
我有以下通用类:
public class MessageProcesser<T> where T : Message
在代码中,我具有以下属性:
private readonly BlockingCollection<T> _messages;
当我尝试这样做时,我得到一个错误(因为 T 是一条消息,它应该是可能的):
_messages.Add(new Message(MessageType.Stop));
怎么了?
谢谢!
您没有消息集合。消息不能是 T,因为 T 可能已被继承。
尝试
private readonly BlockingCollection<Message> _messages;
编译器错误是您假设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