C# 在FSM中为状态转换提供参数的最佳方法

C# 在FSM中为状态转换提供参数的最佳方法,c#,state-machine,C#,State Machine,我的FSM中的一个州需要外部世界的一些信息来完成它的工作。当要求转换时,需要提供此信息。实现这一目标的最佳方式是什么?此时,我使用FSM类作为黑板,在各州之间共享信息 一个非常糟糕的解决方案可能是将此信息缓存在FSM中,并在请求转换之前填充它,然后让状态从FSM黑板获得它。我真的不喜欢它 我的语言是C# 干杯。为了说明我通过代表的意思: class MyStateMachine { private readonly Func<string> askForName; publ

我的FSM中的一个州需要外部世界的一些信息来完成它的工作。当要求转换时,需要提供此信息。实现这一目标的最佳方式是什么?此时,我使用FSM类作为黑板,在各州之间共享信息

一个非常糟糕的解决方案可能是将此信息缓存在FSM中,并在请求转换之前填充它,然后让状态从FSM黑板获得它。我真的不喜欢它

我的语言是C#


干杯。

为了说明我通过代表的意思:

class MyStateMachine
{
  private readonly Func<string> askForName;

  public MyStateMachine(Func<string> askForName)
  {
    this.askForName = askForName;
  }

  // ...

  void StateTransitionForActionX()
  {
    var name = askForName();

    // ...
  }
}

public MyStateMachine CreateMachine()
{
  return new MyStateMachine
   (
     () => 
     {
       Console.WriteLine("Please, enter your name: ");
       return Console.ReadLine();
     }
   );
}
class-mystate机器
{
私有只读函数askForName;
公共MyStateMachine(Func askForName)
{
this.askForName=askForName;
}
// ...
void StateTransitionForActionX()
{
var name=askForName();
// ...
}
}
公共MyStateMachine CreateMachine()
{
返回新的MyState机器
(
() => 
{
Console.WriteLine(“请输入您的姓名:”);
返回控制台ReadLine();
}
);
}

当然,这可以用于任何数据请求——使用控制台似乎是一种简单的方法来说明这一想法:)闭包尤其强大。

如何处理FSM本身?使用
yield
await
编写短信真是太棒了-它让你拥有难以置信的灵活性并节省了大量时间。但至少,您可以传递FSM在执行状态更改时可以调用的委托。传递函数通常是一种非常强大的模式:))很抱歉这个愚蠢的问题,但是,这个委托与参数传递有什么关系?我想我错过了什么。当前状态只是执行每个更新,这是逻辑执行的方式。我现在不使用屈服或等待。无论如何,我认为他们与OP问题无关。我在谷歌上搜索了一下,在C#上找不到内置的FSM实现,所以我不知道你在使用什么类。如果是第三方图书馆,你应该让我们知道哪一个(也可能是链接)。如果是您的实现,我们至少需要知道接口。也许这个问题可以帮助您。这是一个很好的方法。无论如何,我已经走上了“事件”的道路。此时,我的状态机支持将事件名称或事件类传递给enter方法(这是因为我们通常只需一个事件名称就足够了,它只是一个int)。通过这种方式,它可以按状态存储并在以后使用。