c# - 处理枚举更改方法的更好方法?

标签 c# enums

最初,我希望用枚举进行某种封装,但显然那不是 yet possible with C# .我的目的是用枚举存储某种数据。理想情况下,拥有一个对象枚举会很棒。但显然没有办法做到这一点。所以我创建了一个状态类,一个公共(public)枚举,并使用一个 setter 创建了一个公共(public) getter/setter,该 setter 初始化一个方法,在该方法中我可以将对象作为属性填充。 我想知道是否有更好的方法。对我来说,理想的解决方案是以正常方式设置状态(枚举):

car.State = CarStates.Idle;

然后像这样访问有关该状态的更多数据:

string message = car.State.Message();

但这将涉及将属性附加到 State 枚举。有什么很酷的技巧可以达到这种效果吗?枚举是您可以通过简单地在末尾添加 .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;
    }
}

最佳答案

您是否尝试过扩展方法?在静态类中,定义:

public static string Message( this CarStates value )
{
    switch (value) {
    ...
    }
}

关于c# - 处理枚举更改方法的更好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15319638/

相关文章:

c# - C# 中的 Linkdemand 警告

c# - 在 C# 中用换行符拆分字符串

c# - 从代码 (C#) 使用 FontIcon Glyph

C# 键枚举混淆 : Keys. Alt 或 Keys.RButton |键.ShiftKey |键.Alt

c# - JsonConvert 属性似乎被跳过。为什么?

c++ - std::vector<Bar> 作为 Foo 类中的成员变量需要 Bar 的空构造函数

c# - 在 wpf 中从子控件中设置属性

c# - HttpClient,输出有关下载过程的信息

C++:如何在函数中创建枚举?

ios - 开关错误 : Expected member name or constructor call - what's wrong?