nir*_*mus 22 c# iteration enums
可能重复:
如何枚举枚举?
我不知道是否有可能做我想做的事,但我想为什么不这样做.
我有一个例子枚举:
public enum Animals {
    Cat,
    Dog,
    ...
}
我想要做的是迭代这个枚举.我希望它的工作方式如下:
foreach( var type in Animals ) {
    Console.WriteLine( type.toString() );
}
输出将是:
 Cat
 Dog
可能吗?我不想把每个项目都放到一个数组中,然后迭代,我想直接迭代这个枚举.
Jon*_*eet 19
编辑:请注意,在整个答案中我已重命名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()...