Я думаю, что проблема с вашим FSM.Вы создаете многомерный массив действий.Вместо этого попробуйте поискать, как словарь.Здесь у вас есть словарь, где ключ - это статус, а значение - действие, которое вы хотите выполнить.Это сработало для меня.Вот что я изменил.
private Dictionary<int, Action> fsm;
public FiniteStateMachine()
{
this.fsm = new Dictionary<int, Action>() {
{ (int)States.Submitted, SubmittedForReview },
{(int)States.Reviewed, Reviewing },
{(int)States.Approved, Approving}
};
}
public void ProcessEvent(Events theEvent)
{
var action = fsm[(int)theEvent];
action.Invoke();
}
РЕДАКТИРОВАТЬ 1
Причина, по которой вы получаете нулевую ссылку при обработке Reviewed, заключается в том, что для State задано значение Submitted.Перечисления в C # начинаются с 0, поэтому при вызове
fsm.ProcessEvent(FiniteStateMachine.Events.Reviewed);
вы пытаетесь найти следующее:
public void ProcessEvent(Events theEvent)
{
//this.fsm[(int)this.State, (int)theEvent].Invoke();
this.fsm[0, 1].Invoke();
}
, поскольку this.State все еще отправлено.Итак, вы пытаетесь вызвать действие по индексу 1 индекса 0, который является нулевым.Надеюсь, это поможет.