Приведение во время исполнения с использованием параметра общего типа

Я создаю функцию диспетчеризации команд, которая позволяет объекту, производному от базового класса, разрешать (из контейнера 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так что актерский состав будет ICommandHandler<CommandBase>, который не реализован TestHandler, например. И независимо от того, смогу ли я его правильно разыграть, я не смогу вернуть реализацию ICommandHandler<TestCommand> когда T=CommandBase,

Есть ли способ обойти это? Я не специально заблокирован в методе GetHandler, все, что вписывается в HandleCommand метод в порядке (мне нужно иметь одну точку входа, которая принимает базовый класс, и я не могу сделать некоторые монолит переключателя / регистр)

0 ответов

Другие вопросы по тегам