我一直在尝试为我的应用程序编写一个简单的静态类状态机,以便在系统状态更改时通知其他控件和代码。而且我想我几乎拥有它,但是我遇到了一个小问题,我不确定如何解决。
这是代码:
// 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”应该指回实例化对象(而不是静态类)的自身。
我宁愿为我的状态机使用一个静态类,而不是我可以实例化多个副本的静态类。(并不是说这会是一件坏事,但我觉得它使代码更干净,有一个静态类。)
那么我该怎么做呢?
更新:
作为后续行动,我选择 Jon Skeet 的答案作为正确答案,因为问题更多是关于我所采用的方法,而不是我遇到的技术故障。虽然,下面几乎所有其他答案都解决了我正在处理的技术故障。
奇怪的是,当我和我的同事审查我编写的应用程序时,她指出该程序可能应该跟踪服务器连接的状态以及正在完成的工作的状态。(是的,Virginia,这意味着我需要 2 个状态机……所以,从上面的代码中删除所有“静态”关键字并使其成为常规类是明智的方法。)
再次感谢大家!