我正在构建一个程序来处理来自各种主题的消息。由于每个主题的数据不同,我需要专用的类来消耗任何给定主题的数据。我想这样做是使用一个处理与消息系统通信的基类,以及实现消息处理的派生类:
public abstract class MessageConsumer<T>
{
public void Start(){/*omitted*/}
/* Other abstract properties and methods here to support template pattern*/
}
Start
方法会告诉MessageConsumer
开始提取新邮件。派生类的示例是:
public class CreatedMessageConsumer : MessageConsumer<CreatedMessage>
{
/*Implementation omitted*/
}
public class DeletedMessageConsumer : MessageConsumer<DeletedMessage>{}
在上面的代码片段中,我省略了所需的构造函数参数,但很容易想象DiContainer在这里如何有用。我使用Autofac。使用Autofac注册CreatedMessageConsumer
和DeletedMessageConsumer
效果很好。
我的问题是如何解决从MessageConsumer<>
派生的所有类。
此SO post讨论了如何解析给定的派生类型,但我想解析从MessageConsumer
派生的所有类型。随后我想在所有这些方法上调用Start
方法,例如
foreach(var consumer in container.Resolve<IEnumerable<MessageConsumer<??>>())
{
consumer.Start();
}
但是,因为我无法提供泛型参数,所以不会编译。知道怎么做吗?我使用的是Autofac 4.2.1。
答案 0 :(得分:3)
如果你不关心泛型参数,(你不会在你的上一个代码块中指定一个泛型参数),那么:
As
链更新的代码:
public interface IStartable {
void Start();
}
public abstract class MessageConsumer<T> : IStartable
{
public void Start(){/*omitted*/}
/* Other abstract properties and methods here to support template pattern*/
}
Caling code:
foreach(var consumer in container.Resolve<IEnumerable<IStartable>>())
{
consumer.Start();
}