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

C# 涉及泛型类型参数的运行时强制转换,c#,type-conversion,generic-variance,C#,Type Conversion,Generic Variance,我正在构建一个命令分派函数,这样,给定一个从基类派生的对象,它将解析(从IoC容器)命令类型的处理程序,并将命令对象发送到那里进行处理。我的类型如下: public abstract class CommandBase { } public interface ICommandHandler<in TCommand> where TCommand : CommandBase { void Process(TCommand command); } public IComma

我正在构建一个命令分派函数,这样,给定一个从基类派生的对象,它将解析(从IoC容器)命令类型的处理程序,并将命令对象发送到那里进行处理。我的类型如下:

public abstract class CommandBase { }
public interface ICommandHandler<in TCommand> where TCommand : CommandBase { 
    void Process(TCommand command);
}
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
,因此强制转换为
ICommandHandler
,例如,它不是由
TestHandler
实现的。无论我是否可以正确地强制转换它,当
T=CommandBase
时,我都无法返回
ICommandHandler
的实现


有办法解决这个问题吗?我没有明确地锁定在GetHandler方法中,任何适合
HandleCommand
方法的东西都可以(我需要一个接受基类的入口点,并且我不能做一些开关/案例整体)

开关/案例整体的一个很好的替代方法是维护一个将命令与处理程序关联起来的字典。然后你只需检查字典,而不是用开关硬编码。@KeithPayne:Hm,我不知道该怎么做-我应该从字典中取出什么类型的内容?你发布的内容有什么问题?跳出的唯一一件事是,您可以编写
公共void HandleCommand(T命令),其中T:CommandBase…
。但这要视情况而定。您试图解决的问题是什么?@KeithPayne:问题是
T
将是
CommandBase
,而不是
TestCommand
,因此我无法将
TestHandler
转换为
ICommandHandler
,因为
TestHandler
没有实现
ICommandHandler
,而是
ICommandHandler
public void HandleCommand(CommandBase command) {
    var handler = GetHandler(command);
    handler.Process(command);
}