如何在C#中枚举枚举?

例如,以下代码无法编译:

public enum Suit
{
    Spades,
    Hearts,
    Clubs,
    Diamonds
}

public void EnumerateAllSuitsDemoMethod()
{
    foreach (Suit suit in Suit)
    {
        DoSomething(suit);
    }
}

它给出了以下编译时错误:

“Suit”是“type”,但与“variable”类似

它在第二个Suit关键字上失败。


当前回答

枚举类型被称为“枚举类型”,并不是因为它们是“枚举”值的容器(它们不是),而是因为它们是通过枚举该类型变量的可能值来定义的。

(实际上,这有点复杂——枚举类型被认为具有“基础”整数类型,这意味着每个枚举值都对应一个整数值(这通常是隐式的,但可以手动指定)。C#的设计方式使您可以将该类型的任何整数填充到枚举变量中,即使它不是“命名”值。)

System.Enum.GetNames方法可用于检索字符串数组,如名称所示,字符串数组是枚举值的名称。

EDIT:应该建议改用System.Enum.GetValues方法。哎呀。

其他回答

我知道这有点乱,但如果你喜欢一句话,这里有一句:

((Suit[])Enum.GetValues(typeof(Suit))).ToList().ForEach(i => DoSomething(i));

在我看来,你真的想打印出每个枚举的名称,而不是值。在这种情况下,Enum.GetNames()似乎是正确的方法。

public enum Suits
{
    Spades,
    Hearts,
    Clubs,
    Diamonds,
    NumSuits
}

public void PrintAllSuits()
{
    foreach (string name in Enum.GetNames(typeof(Suits)))
    {
        System.Console.WriteLine(name);
    }
}

顺便说一句,增加值不是枚举枚举值的好方法。你应该这样做。

我会改用Enum.GetValues(typeof(Suit))。

public enum Suits
{
    Spades,
    Hearts,
    Clubs,
    Diamonds,
    NumSuits
}

public void PrintAllSuits()
{
    foreach (var suit in Enum.GetValues(typeof(Suits)))
    {
        System.Console.WriteLine(suit.ToString());
    }
}

有两种方法可以迭代枚举:

1. var values =  Enum.GetValues(typeof(myenum))
2. var values =  Enum.GetNames(typeof(myenum))

第一个将以**对象**s数组的形式提供值,第二个将以**String**s数组形式提供值。

在foreach循环中使用它,如下所示:

foreach(var value in values)
{
    // Do operations here
}

某些版本的.NET框架不支持Enum.GetValues。以下是Ideas 2.0的一个很好的解决方法:Compact framework中的Enum.Get Values:

public Enum[] GetValues(Enum enumeration)
{
    FieldInfo[] fields = enumeration.GetType().GetFields(BindingFlags.Static | BindingFlags.Public);
    Enum[] enumerations = new Enum[fields.Length];

    for (var i = 0; i < fields.Length; i++)
        enumerations[i] = (Enum) fields[i].GetValue(enumeration);

    return enumerations;
}

与任何涉及反射的代码一样,您应该采取措施确保它只运行一次并缓存结果。

我的解决方案在.NET Compact Framework(3.5)中工作,并支持编译时的类型检查:

public static List<T> GetEnumValues<T>() where T : new() {
    T valueType = new T();
    return typeof(T).GetFields()
        .Select(fieldInfo => (T)fieldInfo.GetValue(valueType))
        .Distinct()
        .ToList();
}

public static List<String> GetEnumNames<T>() {
    return typeof (T).GetFields()
        .Select(info => info.Name)
        .Distinct()
        .ToList();
}

如果有人知道如何去掉T valueType=new T(),我很乐意看到一个解决方案。

通话内容如下:

List<MyEnum> result = Utils.GetEnumValues<MyEnum>();