我正在构建一个命令调度函数,这样给定一个派生自基类的对象,它会(从 IoC 容器)解析命令类型的处理程序并将命令对象发送到那里进行处理。我的类型如下所示:
public abstract class CommandBase { }
public interface ICommandHandler<in TCommand> where TCommand : CommandBase {
void Process(TCommand command);
}
示例实现:
public class TestCommand : CommandBase {
// Some parameters
}
public class TestHandler : ICommandHandler<TestCommand> {
public void Process(TestCommand command) {
// Do something
}
}
当我接到电话时,我可以(几乎)从我的容器中检索匹配的处理程序,如下所示:
public ICommandHandler<T> GetHandler<T>(T command) where T : CommandBase
{
var handlerInterface = typeof (ICommandHandler<>);
var handlerType = handlerInterface.MakeGenericType(command.GetType());
var handler = _scope.Resolve(handlerType) as ICommandHandler<T>;
// Some magic?
return handler;
}
我想这样称呼:
public void HandleCommand(CommandBase command) {
var handler = GetHandler(command);
handler.Process(command);
}
问题是类型参数T
是CommandBase
,所以转换将是 to ICommandHandler<CommandBase>
,例如,它不是由 实现的TestHandler
。而且无论我是否可以正确转换它,我都无法返回ICommandHandler<TestCommand>
when 的实现T=CommandBase
。
有没有办法解决这个问题?我没有特别锁定 GetHandler 方法,任何适合该HandleCommand
方法的东西都很好(我需要有一个接受基类的单一入口点,并且我不能做一些 switch/case 整体)