当初、私の望みは列挙型で何らかのカプセル化を行うことでしたが、C#ではまだそれが不可能なようです。私の目的は、列挙型を使用してある種のデータを格納することでした。理想的には、オブジェクトの列挙型があれば素晴らしいと思います。しかし、どうやらそれを行う方法はありません。そこで、状態クラス、パブリック列挙型を作成し、オブジェクトをプロパティとして設定できるメソッドを初期化するセッターを使用して、パブリックゲッター/セッターを作成しました。もう少し良い方法があるのだろうかと思います。私にとって理想的な解決策は、通常の方法で状態(列挙型)を設定することです。
car.State = CarStates.Idle;
次に、その状態に関するより多くのデータに次のようにアクセスします。
string message = car.State.Message();
ただし、これには、プロパティをState列挙型にアタッチすることが含まれます。この効果を達成するためのクールなトリックはありますか?列挙型は、末尾に追加するだけで切り替え可能なシングルトンのような値を作成できる唯一の方法ですか?.Idle
これが私が今持っているコードで、レイヤーを追加することで状態情報を1つのレベルに保ちます。これは無難ですが、のようなものを宣言すると冗長に感じますcar.Mode.State = CarModeStates.Idle;
。
class Car
{
public CarState Mode;
public Car()
{
Mode = new CarState();
}
}
class CarState //holds any metadata for given enum value
{
private int _EnumInt;
private string _Message;
private bool _IsError = false;
public CarModeStates State
{
get { return (CarModeStates)_EnumInt; }
set { _EnumInt = (int)value; InitializeState(value); }
}
public string Message { get { return _Message; } }
public bool IsError { get { return _IsError; } }
public void InitializeState(CarModeStates? cs)
{
switch (cs)
{
case (CarModeStates.Off):
{
_Message = "Car is off.";
_IsError = false;
break;
}
case (CarModeStates.Idle):
{
_Message = "Car is idling.";
_IsError = false;
break;
}
case (CarModeStates.Drive):
{
_Message = "Car is driving.";
_IsError = false;
break;
}
case (CarModeStates.Accident):
{
_Message = "CRASH!";
_IsError = true;
break;
}
}
}
}
public enum CarModeStates
{
Off,
Idle,
Drive,
Accident,
}
//And from the outside:
class SomeController
{
Car car = new Car();
public string GetStateMessage()
{
car.Mode.State = CarModeStates.Idle;
return car.Mode.Message;
}
}