c# - 我如何在类型安全的枚举模式上使用 switch 语句

标签 c# design-patterns switch-statement

我以不同的方式找到了一个关于实现枚举的漂亮示例。我认为这就是所谓的类型安全枚举模式。我开始使用它,但我意识到我不能在 switch 语句中使用它。
我的实现如下所示:

public sealed class MyState
{
    private readonly string m_Name;
    private readonly int m_Value;

    public static readonly MyState PASSED= new MyState(1, "OK");
    public static readonly MyState FAILED= new MyState(2, "ERROR");

    private MyState(int value, string name)
    {
        m_Name = name;
        m_Value = value;
    }

    public override string ToString()
    {
        return m_Name;
    }

    public int GetIntValue()
    {
        return m_Value;
    }
}

为了能够在 C# 的 switch 语句中使用此模式,我可以向我的类中添加什么?
谢谢。

最佳答案

你可以尝试这样的事情:

class Program
{
    static void Main(string[] args)
    {
        Gender gender = Gender.Unknown;

        switch (gender)
        {
            case Gender.Enum.Male:
                break;
            case Gender.Enum.Female:
                break;
            case Gender.Enum.Unknown:
                break;
        }
    }
}

public class Gender : NameValue
{
    private Gender(int value, string name)
        : base(value, name)
    {
    }

    public static readonly Gender Unknown = new Gender(Enum.Unknown, "Unknown");
    public static readonly Gender Male = new Gender(Enum.Male, "Male");
    public static readonly Gender Female = new Gender(Enum.Female, "Female");
    public class Enum
    {
        public const int Unknown = -1;
        public const int Male = 1;
        public const int Female = 2;
    }

}

public abstract class NameValue
{
    private readonly int _value;
    private readonly string _name;

    protected NameValue(int value, string name)
    {
        _value = value;
        _name = name;
    }

    public int Value
    {
        get { return _value; }
    }

    public string Name
    {
        get { return _name; }
    }

    public override string ToString()
    {
        return Name;
    }
    public override int GetHashCode()
    {
        return Value.GetHashCode();
    }

    public override bool Equals(object obj)
    {
        NameValue other = obj as NameValue;
        if (ReferenceEquals(other, null)) return false;
        return this.Value == other.Value;
    }

    public static implicit operator int(NameValue nameValue)
    {
        return nameValue.Value;
    }
}

关于c# - 我如何在类型安全的枚举模式上使用 switch 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10100350/

相关文章:

c# - 将 Table<T> 转换为某物

iOS/AVFoundation : Design pattern for asynch handlers when turning arrays of images into tracks and then into a single video?

jquery - 前端代码的 BDD?

C++ switch 语句结束菜单

c - 在 C 中使用用户输入的字符串从一个函数到另一个函数

c# - 为什么 DefaultAzureCredential 尝试在本地计算机上使用 ManagedIdentityCredential?

c# - 你如何计算字符串的像素大小?

c - 如何用C创建菜单?

c# - C# 中 C++ const size_t 的等价物是什么?

c++ - 类的常量成员变量可以在方法而不是构造函数中初始化吗?