我有两种几乎相同签名的方法。唯一的区别是其中一个使用特定类型而另一个使用基类。
public abstract class CommandHandlerBase<TCommand> : ICommandHandler<TCommand>
where TCommand : CommandBase
{
public int Id { get; }
public CommandHandlerBase(int id)
{
this.Id = id;
}
public bool CanHandle(CommandBase command, Context context)
{
if (command.GetType() == typeof(TCommand))
return CanHandle((TCommand)command, context);
else
return false;
}
public abstract bool CanHandle(TCommand command, Context context);
public IEnumerable<EventBase> Handle(CommandBase command)
{
if (command.GetType() == typeof(TCommand))
return Handle((TCommand)command);
else
throw new ArgumentException("The handler cannot handle the given command type");
}
public abstract IEnumerable<EventBase> Handle(TCommand command);
}
现在我试图声明如果命令类型是正确的类型,则会调用特定的方法。
这是我到目前为止所做的:
var commandHandlerBaseMock = new Mock<CommandHandlerBase<TestCommand1>>(id);
commandHandlerBaseMock.CallBase = true;
var command = new TestCommand1();
commandHandlerBaseMock.Setup(ch => ch.CanHandle(command, null)).Returns(true);
bool result = commandHandlerBaseMock.Object.CanHandle(command, null);
result.Should().BeTrue();
问题在于,这断言调用被调用的方法,这根本没有用。实施永远不会受到影响 有没有办法模拟方法的一个特定重载?
答案 0 :(得分:0)
这种代码结构是不可持续的......你在instanceOf检查中添加(通常是一个坏的标志)并试图以多态方式隐藏签名。 TCommand类型的对象总是会遇到基类中TCommand特定的实现,我期待。
如果您需要两个不同的处理程序,基于两种不同的类型,请考虑根本没有基类实现或使用&#34; Tell,Don&#t; Ask&#34;原则并将处理推送到命令本身(您可以使用&#34;模板方法&#34;抽象处理程序中的模式来执行&#34;泛型的东西&#34;),这意味着您不需要基类中依赖于某些类型的任何专业代码。