迭代枚举类型
可能重复:
我如何列举一个枚举?
我不知道是否可以做我想做的事,但我想为什么不。
我有一个例子枚举:
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下一篇: Convert Enum to List