【发布时间】:2014-07-05 02:23:48
【问题描述】:
我正在尝试拥有一个 List 的开放泛型类型。是否有可能有类似的东西:
public class MessageProcessor
{
private IDictionary<Type, IMessageHandler<>> _messageHandlers
= new Dictionary<Type, IMessageHandler<>>();
public void AddHandler<TMessage>(IMessageHandler<TMessage> handler)
{
var messageType = typeof(TMessage);
// Add to dictionary here
}
public void Handle<TMessage>(TMessage message)
{
// Call the correct handler here.
}
}
IMessageHandler 应该有一个强类型方法:
public void Handle(TMessage message) {}
我的真实例子稍微复杂一点,所以我希望我在这里正确地简化了它。
事实上,我对每个处理程序的泛型类型不感兴趣。我只需要将它们全部放在一个地方,并且我可以轻松找到正确的处理程序,如果我可以将它们放在一个地方。
私有字典将以消息的类型 (TMessage) 作为键。所以我希望能够做到:
// ByteArrayHandler implements IMessageHandler<byte[]>
x.AddHandler(new ByteArrayHandler())
// StringHandler implements IMessageHandler<string>
x.AddHandler(new StringHandler())
x.Handle("Some message");
x.Handle(new byte[] { 1, 2, 3} );
让MessageProcessor 调用正确的MessageHandler。
【问题讨论】:
-
我会将消息类型和消息处理程序之间的关系保留在配置文件(app.config 或 web.config)和用户依赖注入或 IOC 中,以便在收到消息时实例化和“处理”。 unity.codeplex.com
-
IDictionary<Type, object>听起来可以吗? -
难道你不能让
IMessageHandler公开一个Type属性来告诉你它处理什么而不是让它通用吗? -
你可能想看看 MVVMLight。它实现了与其信使类非常相似的东西。 [1]:mvvmlight.net/doc
-
您的
Handle方法是通用的,但它并没有真正为您带来任何好处,因为它们只在运行时使用。
标签: c# generics open-generics