我一直在尝试为我的应用程序编写一个简单的静态类状态机,以便在系统状态更改时通知其他控件和代码。我想我几乎已经解决了,但我遇到了一个小问题,我不知道如何解决。
这是代码:
// 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”这个词是非法的。我明白为什么:“this”应该引用实例化对象的自身(而不是静态类)。
我更愿意为我的状态机提供一个静态类,而不是一个可以实例化多个副本的类。 (并不是说这会是一件坏事,但我觉得拥有静态类会让代码更干净。)
那么我该怎么做呢?
Update:
作为后续行动,我选择乔恩·斯基特的答案作为正确的答案,因为问题更多的是关于我所采取的方法,而不是我遇到的技术故障。尽管如此,下面几乎所有其他答案都修复了我正在处理的技术故障。
奇怪的是,当我与同事一起审查我编写的应用程序时,她指出该程序可能应该跟踪服务器连接的状态以及正在完成的工作的状态。 (是的,弗吉尼亚,这意味着我需要 2 个状态机......因此,从上面的代码中删除所有“静态”关键字并使其成为常规类是明智的方法。)
再次感谢大家!