Exemple #1
0
        public void AddTransition <TTrigger>(T fromState, T toState, Trigger <TTrigger> trigger, Func <TTrigger, bool> condition, Action <TTrigger> transitionAction) where TTrigger : class
        {
            var stateObject = GetState(fromState);

            var transition = new TriggeredTransition <T, TTrigger>(fromState, toState, trigger, transitionAction, condition);

            stateObject.AddTriggeredTransition(transition);
        }
        public void AddTriggeredTransition <TTrigger>(TriggeredTransition <T, TTrigger> transition) where TTrigger : class
        {
            _transitions.Add(transition.Trigger.Sequence);

            transition.Trigger.Sequence.Subscribe(args =>
            {
                if (transition.Condition != null)
                {
                    try
                    {
                        bool success = false;

                        if (_stateMachine.CurrentDispatcher != null)
                        {
                            success = (bool)_stateMachine.CurrentDispatcher.Invoke(transition.Condition, args);
                        }
                        else
                        {
                            success = transition.Condition(args);
                        }

                        if (!success)
                        {
                            return;
                        }
                    }
                    catch (Exception e)
                    {
                        _stateMachine.RaiseStateMachineException(e);
                        return;
                    }
                }

                Action action = () => _stateMachine.TransitionStateInternal(transition.FromState, transition.ToState, args, transition.TransitionAction);

                _stateMachine.EnqueueTransition(action);
            });
        }