无状态库 - PermitIf 与 SetTriggerParameters<T> 一起使用

问题描述

如何将 PermitIfSetTriggerParameters 一起使用?

在这个例子中,我正在模拟一个电机,它可以前进、后退或关闭(不移动)。向前和向后可以是 double 速度,因此我需要 SetTriggerParameters<double>。但是,将速度设置为 0 会关闭电机。

我希望禁止能够以 0 的参数触发 TurnOnForwardsTurnOnBackwards - 我希望 TurnOff 触发器明确作为关闭电机的方式。否则,您会到达当前状态为 Forwards/Backwards 但速度为 0 的情况。

这是我得到的错误

CS1503 参数 1:无法从“UserQuery.Triggers”转换为“Stateless.StateMachine.TriggerWithParameters”

public enum State
{
    Off,Forwards,Backwards
}

public enum Triggers
{
    TurnOff,TurnOnForwards,TurnOnBackwards,}

var machine = new StateMachine<State,Triggers>(State.Off);

var forwardsTrigger = machine.SetTriggerParameters<double>(Triggers.TurnOnForwards);
var backwardsTrigger = machine.SetTriggerParameters<double>(Triggers.TurnOnBackwards);

machine.Configure(State.Off)
    .PermitIf<double>(Triggers.TurnOnForwards,State.Forwards,(speed) => speed > 0) // error
    .PermitIf<double>(Triggers.TurnOnBackwards,(speed) => speed < 0) // error
    .Permit(Triggers.TurnOnForwards,State.Forwards)
    .Permit(Triggers.TurnOnBackwards,State.Backwards);

machine.Configure(State.Forwards)
    .Permit(Triggers.TurnOnBackwards,State.Backwards)
    .Permit(Triggers.TurnOff,State.Off);

machine.Configure(State.Backwards)
    .Permit(Triggers.TurnOnForwards,State.Forwards)
    .Permit(Triggers.TurnOff,State.Off);


machine.Fire(Triggers.TurnOnForwards);
machine.Fire(Triggers.TurnOff);

machine.Fire(Triggers.TurnOnBackwards);
machine.Fire(Triggers.TurnOff);

这可能吗?

解决方法

您现在可能已经弄清楚了,但是如果您使用参数化触发器,它将编译:

    machine.Configure(State.Off)
        .PermitIf(forwardsTrigger,State.Forwards,(speed) => speed > 0) // no error 
        .PermitIf(backwardsTrigger,(speed) => speed < 0) // no error
        .Permit(Triggers.TurnOnForwards,State.Forwards)
        .Permit(Triggers.TurnOnBackwards,State.Backwards);