迭代枚举类型

nir*_*mus 22 c# iteration enums

可能重复:
如何枚举枚举?

我不知道是否有可能做我想做的事,但我想为什么不这样做.

我有一个例子枚举:

public enum Animals {
    Cat,
    Dog,
    ...
}
Run Code Online (Sandbox Code Playgroud)

我想要做的是迭代这个枚举.我希望它的工作方式如下:

foreach( var type in Animals ) {
    Console.WriteLine( type.toString() );
}
Run Code Online (Sandbox Code Playgroud)

输出将是:

 Cat
 Dog
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 19

编辑:请注意,在整个答案中我已重命名AnimalsAnimal.根据.NET约定,只有基于标志的枚举应该具有复数名称.

你可以使用Enum.GetValues():

foreach (var type in (Animal[]) Enum.GetValues(typeof(Animal)) {
    Console.WriteLine(type.toString());
}
Run Code Online (Sandbox Code Playgroud)

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

foreach (Animal type in Enum.GetValues(typeof(Animal)) {
    Console.WriteLine(type.toString());
}
Run Code Online (Sandbox Code Playgroud)

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

foreach (Animal type in Enum.GetValues(typeof(SomeEmptyEnum)) {
    Console.WriteLine(type.toString());
}
Run Code Online (Sandbox Code Playgroud)

哪里SomeEmptyEnum是(显然)的空枚举类型.这里GetValues将返回一个空数组类型SomeEmptyEnum[].上面的代码只会检查返回数组的每个成员是否是正确的类型,因此您不会发现问题.显然,这是不可能在现实生活中发生的,但它表明了某种代码味道的,导致我把结果代替-基本上我远远更喜欢处理强类型集合.


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

foreach (var type in Enums.GetValues<Animal>()) {
    Console.WriteLine(type.ToString());
}
Run Code Online (Sandbox Code Playgroud)

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

  • 没有必要施放
  • 它实际上返回一个不可变列表,因此不需要每次都创建一个新集合,这与标准不同 Enum.GetValues()

它也有一个通用约束强制T成为一个枚举类型,所以你不能不小心用非枚举类型调用它,不像Enum.GetValues()...