迭代枚举类型

可能重复:
我如何列举一个枚举?

我不知道是否可以做我想做的事,但我想为什么不。

我有一个例子枚举:

public enum Animals {
    Cat,
    Dog,
    ...
}

我想要做的是迭代这个枚举。 我希望它能像那样工作:

foreach( var type in Animals ) {
    Console.WriteLine( type.toString() );
}

并且输出将是:

 Cat
 Dog

可能吗? 我不想把每个项都放到一个数组中,然后迭代,我想直接在这个枚举上迭代。


编辑:请注意,在整个这个答案我已经将Animals改名为Animal 。 根据.NET惯例,只有基于标志的枚举应该有复数名称。

你可以使用Enum.GetValues()

foreach (var type in (Animal[]) Enum.GetValues(typeof(Animal)) {
    Console.WriteLine(type.toString());
}

正如Dan的评论所指出的那样,如果你在你的foreach循环中使用显式类型,你不需要强制转换:

foreach (Animal type in Enum.GetValues(typeof(Animal)) {
    Console.WriteLine(type.toString());
}

但是现在你不会尽早发现错误。 例如:

foreach (Animal type in Enum.GetValues(typeof(SomeEmptyEnum)) {
    Console.WriteLine(type.toString());
}

SomeEmptyEnum是(显然)是一个空的枚举类型。 这里GetValues将返回一个SomeEmptyEnum[]类型的空数组。 上面的代码只会检查返回数组的每个成员是否是正确的类型,因此您不会发现问题。 显然这在现实生活中不太可能发生,但是它展示了代码异味,这导致我转而投下结果 - 基本上我更喜欢处理强类型集合。


或者,对于更安全的方法,您可以使用我的Unconstrained Melody库:

foreach (var type in Enums.GetValues<Animal>()) {
    Console.WriteLine(type.ToString());
}

在这里,我的Enums.GetValues<T>()返回一个IList<T> ,这意味着:

  • 没有必要施放
  • 它实际上返回一个不可变列表,所以它不需要每次都创建一个新的集合,这与标准的Enum.GetValues()
  • 它也得到了一个通用的约束,强制T成为一个枚举类型,所以你不会意外地用非枚举类型来调用它,而不像Enum.GetValues() ...


    Enum.GetValues是你的朋友。


    使用Enum.GetNames()来遍历枚举成员的名称。 使用Enum.GetValues()循环访问值。

    链接地址: http://www.djcxy.com/p/16283.html

    上一篇: iterating on enum type

    下一篇: Convert Enum to List