システム状態が変化したときに他のコントロールやコードに通知するために、アプリケーション用の単純な静的クラスのステート マシンを作成しようとしています。そして、私はほとんどそれを持っていると思いますが、回避方法がわからないという小さな問題に遭遇しています。
コードは次のとおりです。
// 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 クラスを使用したいと考えています。(それほど悪いことではありませんが、静的クラスを持つことでコードがきれいになると思います。)
では、これをどのように機能させるべきですか?
アップデート:
フォローアップとして、問題は私が抱えていた技術的な失敗ではなく、私が取っていたアプローチに関するものだったので、Jon Skeet の答えを正しいものとして選択しました。ただし、以下の他の回答のほとんどすべてが、私が扱っていた技術的な不具合を修正します。
奇妙なことに、私が書いたアプリケーションを同僚とレビューしていたとき、彼女はプログラムがサーバー接続の状態と実行中の作業の状態の両方を追跡する必要があると指摘しました。(はい、バージニア州、これは 2 つのステート マシンが必要であることを意味します。したがって、上記のコードからすべての「静的」キーワードを削除し、通常のクラスにすることが賢明なアプローチでした。)
改めまして、皆様!