Example #1
0
        protected void AddTransition <TFromState, TToState, TTransition>()
            where TFromState : State, new()
            where TToState : State, new()
            where TTransition : Transition, new()
        {
            // Create new states and new transition
            State newFromState = GetState <TFromState>() == null
                ? new TFromState()
                : GetState <TFromState>();

            State newToState = GetState <TToState>() == null
                ? new TToState()
                : GetState <TToState>();

            Transition newTransition = GetTransition <TTransition>() == null
                ? new TTransition()
                : GetTransition <TTransition>();

            // Get their types
            Type newFromStateType  = newFromState.GetType();
            Type newToStateType    = newToState.GetType();
            Type newTransitionType = newTransition.GetType();

            // Check if this specific transition already exists
            // ReSharper disable once LoopCanBeConvertedToQuery
            for (int i = 0; i < stateTransitions.Count; i++)
            {
                StateTransition stateTransition = stateTransitions[i];

                if (newFromStateType != stateTransition.FromState.GetType() ||
                    newToStateType != stateTransition.ToState.GetType() ||
                    newTransitionType != stateTransition.Transition.GetType())
                {
                    continue;
                }

                throw new Exception(String.Format(
                                        "Transition <b><{0}></b> from State <b><{1}></b> to State <b><{2}></b> already exists!",
                                        newTransitionType.Name, newFromStateType.Name, newToStateType.Name));
            }

            // Create new transition data...
            StateTransition newStateTransition =
                new StateTransition(newFromState, newToState, newTransition);

            // ...and add to the transition data list
            stateTransitions.Add(newStateTransition);
        }
Example #2
0
        private T GetTransition <T>() where T : Transition
        {
            Transition transition = null;

            for (int i = 0; i < stateTransitions.Count; i++)
            {
                StateTransition stateTransition = stateTransitions[i];

                if (typeof(T) == stateTransition.Transition.GetType())
                {
                    transition = stateTransition.Transition;
                }
            }

            return(transition as T);
        }
Example #3
0
        private StateTransition GetTransitionFromCurrentState <T>() where T : Transition
        {
            for (int i = 0; i < stateTransitions.Count; i++)
            {
                StateTransition stateTransition = stateTransitions[i];

                if (stateTransition.FromState.GetType() == CurrentState.GetType() &&
                    stateTransition.Transition.GetType() == typeof(T))
                {
                    return(stateTransition);
                }
            }

            throw new Exception(String.Format(
                                    "Unable to find Transition <b><{0}></b> from State <b><{1}></b>",
                                    typeof(T).Name, CurrentState.GetType().Name));
        }