如何使用Stateless实现触发时所有状态转至单一状态?
Stateless 全局触发器实现方案
Stateless 本身没有直接提供 RegisterGlobalTrigger 这类原生API,但可以通过以下更简洁的方式实现你的需求:
扩展方法封装(推荐)
可以封装一个扩展方法,一次性为所有已注册状态添加全局触发器规则,避免重复代码:
public static class StateMachineExtensions { public static void RegisterGlobalTrigger<TState, TTrigger>( this StateMachine<TState, TTrigger> machine, TTrigger trigger, TState targetState) { foreach (var state in machine.GetStates()) { // 跳过目标状态,避免不必要的自转换 if (!EqualityComparer<TState>.Default.Equals(state, targetState)) { machine.Configure(state) .Permit(trigger, targetState); } } } }
调用方式非常简洁:
machine.RegisterGlobalTrigger(Trigger.Fault, State.Faulted);
- 该方法会遍历状态机中已注册的所有状态,自动添加触发器转换规则
- 若后续动态新增状态,需重新调用此方法同步配置
- 代码中已跳过目标状态
Faulted的配置,避免冗余的自转换逻辑
优化版状态层次方案
你提到的父状态思路可以进一步简化,无需手动逐个关联继承关系,通过批量配置子状态实现:
// 定义父状态 var everyState = State.Every; // 配置父状态的Fault触发器 machine.Configure(everyState) .Permit(Trigger.Fault, State.Faulted); // 批量关联子状态 machine.Configure(State.Foo).SubstateOf(everyState); machine.Configure(State.Bar).SubstateOf(everyState);
这种方式比逐个注册触发器更高效,也比手动为每个状态单独配置更简洁。
内容的提问来源于stack exchange,提问作者JasonC
相关产品推荐
相关产品推荐

