Первоначально я надеялся, что у меня будет какая-то инкапсуляция с перечислениями, но, видимо, это не yet possible with C#. Моя цель состояла в том, чтобы хранить какие-то данные с перечислением. В идеале, перечислить объекты было бы здорово. Но, похоже, нет никакого способа сделать это. Таким образом, я создал класс состояния, публичное перечисление и создал публичный getter/setter с установщиком, который инициализирует метод, в котором я могу заполнять объекты как свойство. Мне интересно, есть ли несколько лучший способ. Идеальное решение для меня было бы установить состояние (перечисление) обычным способом:Лучший способ обработки методов преобразования enum?
car.State = CarStates.Idle;
, а затем получить доступ к больше данных о том, что состояние, как так:
string message = car.State.Message();
Но это будет связано с присоединением имущества к перечню состояний. Есть ли какой-нибудь классный трюк для достижения этого эффекта? Есть перечисления единственный способ сделать переключаемым, одноточечные значения, просто добавив .Idle
до конца?
Вот код, который у меня есть сейчас, который хранит информацию состояния на одном уровне, добавляя слой, который является проходимым, но чувствует себя излишним при объявлении чего-то вроде 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;
}
}
Я думаю, что вы используете его, нарушая SRP. Сообщение не должно быть связано с перечислением, но должно быть частью некоторой системы локализации. И IsError контекстно-зависим. Он должен быть только на месте, где это отношение требуется. – Euphoric
Само сообщение я хочу связать с контекстом перечисления. Я создал этот код, чтобы проверить простую версию того, что я хотел бы сделать. Например, сообщение может быть вызвано состоянием. – RyanJMcGowan