运行时强制转换涉及泛型类型参数

时间:2014-02-27 14:43:49

标签: c# type-conversion generic-variance

我正在构建一个命令调度函数,这样在给定一个从基类派生的对象时,它会解析(从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);
}

问题是类型参数TCommandBase,因此转换将转到ICommandHandler<CommandBase>,例如TestHandler未实现。无论我是否可以正确地投射它,我都无法在ICommandHandler<TestCommand>时返回T=CommandBase的实现。

有什么方法可以解决这个问题吗?我没有特别锁定在GetHandler方法中,任何适合HandleCommand方法的东西都很好(我需要一个接受基类的单一入口点,我不能做一些switch / case monolith)

0 个答案:

没有答案