Я пытался написать простой State-class State Machine для моего приложения, чтобы уведомлять другие элементы управления и код при изменении состояния системы. И я думаю, что почти у меня это есть, но я сталкиваюсь с небольшой проблемой, которую я не знаю, как обойти.
Вот код:
// An enum denoting the 3 States
public enum Status { Error = -1, Working, Ready }
// The main state change class
public static class Sys
{
// system status
private static Status state;
// delegate and event
public static delegate void StateChangeHandler(object sys, SysInfoEventArgs sysStateInfo);
public static event StateChangeHandler OnStateChange;
public static Status State
{
get { return state; }
set
{
SysInfoEventArgs sysInfo = new SysInfoEventArgs(state, value);
state = value;
OnStateChange(this, sysInfo);
}
}
}
/// <summary>Contains previous and current state info</summary>
public class SysInfoEventArgs : EventArgs
{
public readonly Status oldState;
public readonly Status newState;
public SysInfoEventArgs(Status oldState, Status newState)
{
this.oldState = oldState;
this.newState = newState;
}
}
У меня проблема с этой строкой:
OnStateChange(this, sysInfo);
В частности, слово «это» является незаконным. И я понимаю, почему: «this» должно ссылаться на себя экземпляра объекта (не статического класса).
Я бы предпочел иметь класс Static для моего конечного автомата, а не класс, для которого я могу создать несколько копий. (Не то чтобы это было так плохо, но я чувствую, что это делает код более чистым, имея статический класс.)
Так, как я должен работать это?
Обновление:
В качестве продолжения я выбрал правильный ответ Джона Скита, потому что проблема была больше в подходе, который я использовал, а не в техническом сбое, которое я имел. Хотя почти все остальные ответы ниже исправляют технический сбой, с которым я имел дело.
Как ни странно, когда я просматривал со своим коллегой приложение, которое я написал, она указала, что программа, вероятно, должна отслеживать как состояние соединения с сервером, так и состояние выполняемой работы. (Да, Вирджиния, это означает, что мне нужны 2 конечных автомата ... Ergo, удалите все «статические» ключевые слова из кода выше и сделайте его обычным классом.)
Еще раз спасибо всем!