C# 枚举实践

52 阅读1分钟

概念

枚举的基础类型是整型,因此,如下的定义方式是错误的。

    enum Colors
    {
        Red = "red",
        Green = "green",
        Blue = "blue",
    }

正确的定义方式如下:

    enum Colors
    {
        Unknown = -1,
        Red = 0,
        Green = 1,
        Blue = 3,
    }

从整数到枚举的转换

    int status = 3;
    Rainbow rainbow;
    if (Enum.IsDefined(typeof(Rainbow), status))
    {
        rainbow = (Rainbow)3;
    } else
    {
        rainbow = Rainbow.Unknown;
    }

注意:对待转换的整数要做检查,防止枚举中没有对应的数值。

检索枚举成员名称

    string[] names = Enum.GetNames(typeof(Rainbow));
    foreach(string name in names)
    {
        Rainbow value = (Rainbow)Enum.Parse(typeof(Rainbow), name);
        Console.WriteLine("{0}:{1:D}", name, value);
    }
    var values = Enum.GetValues(typeof(Rainbow));
    foreach(Rainbow value in values)
    {
        Console.WriteLine("{0}:{1:D}", value, value);
    }

作为参数类型约束的枚举

首先定义一个彩虹七色枚举

    enum Rainbow
    {
        Red,
        Orange,
        Yellow,
        Green,
        Blue,
        Indigo,
        Violet
    }

泛型必须是枚举类型

    public static Dictionary<int, string> EnumNamedValues<T>() where T : Enum
    {
        var result = new Dictionary<int, string>();
        var values = Enum.GetValues(typeof(T));
        foreach (int item in values)
        {
            result.Add(item, Enum.GetName(typeof(T), item)!); // 加了一个 !
        }
        return result;
    }

遍历获取枚举 key 或者 枚举 value

    var map = EnumNamedValues<Rainbow>();
    foreach(var pair in map)
    {
        Console.WriteLine($"{pair.Key}:\t{pair.Value}");
    }