【发布时间】:2016-09-21 07:06:07
【问题描述】:
考虑以下接口和类声明。
public interface IMessage
{
string Body { get; set; }
}
public abstract class MessageBase : IMessage
{
public string Body { get; set; }
}
public class MessageA : MessageBase { }
public class MessageB : MessageBase { }
public class MessageC : MessageBase { }
public interface IMessageProcessor<T> where T : IMessage
{
Action<T> ProcessorAction { get; set; }
}
public abstract class MessageProcessorBase<T> : IMessageProcessor<T> where T : MessageBase
{
public Action<T> ProcessorAction { get; set; }
}
public class MessageAProcessor : MessageProcessorBase<MessageA> { }
public class MessageBProcessor : MessageProcessorBase<MessageB> { }
public class MessageCProcessor : MessageProcessorBase<MessageC> { }
现在我想像这样声明一个处理器实例列表,但不知道什么泛型类型可以让我将任何派生处理器类型添加到列表中。
var processors = new List<???>();
processors.Add(new MessageAProcessor());
processors.Add(new MessageBProcessor());
processors.Add(new MessageCProcessor());
我试过了:
// compiles but throws InvalidCastException
var processors = new List<IMessageProcessor<IMessage>>();
processors.Add((IMessageProcessor<IMessage>)new MessageAProcessor());
和
// compiles but throws InvalidCastException
var processors = new List<IMessageProcessor<MessageBase>>();
processors.Add((IMessageProcessor<MessageBase>)new MessageAProcessor());
和
// won't compile
var processors = new List<MessageProcessorBase<MessageBase>>();
processors.Add((MessageProcessorBase<MessageBase>)new MessageAProcessor());
这个列表的类型应该是什么?我知道我必须在这里遗漏一些明显的东西。在这里的任何帮助将不胜感激。谢谢!
【问题讨论】:
标签: c# generics inheritance interface