我不知道是否有可能做我想做的事,但我想为什么不这样做。
我有例子枚举:
public enum Animals {
Cat,
Dog,
...
}
我想要做的是迭代这个枚举。我希望它能像那样工作:
foreach( var type in Animals ) {
Console.WriteLine( type.toString() );
}
,输出结果为:
Cat
Dog
有可能吗?我不想把每个项目都放到一个数组中,然后迭代,我想直接迭代这个枚举。
答案 0 :(得分: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()
......
答案 1 :(得分:1)
Enum.GetValues是你的朋友。
答案 2 :(得分:1)
使用Enum.GetNames()循环查看枚举成员的名称。使用Enum.GetValues()循环显示值。
答案 3 :(得分:1)
要在Jon's answer中保存一些输入,请明确指定类型,您不必进行强制转换:
foreach (Animal a in Enum.GetValues(typeof(Animal)) {
Console.WriteLine(a);
}
但是,explained by Jon需要另外注意。
另请注意,C#枚举名称通常应采用单数形式(Animal
,而非Animals
),除非它们标有[Flags]
属性,允许组合。
答案 4 :(得分:1)
试试这个:
enum animals
{
cat,
dog,
fish
}
private void Form1_Load(object sender, EventArgs e)
{
foreach (string myAnimal in Enum.GetNames(typeof(animals)))
{
Debug.WriteLine(myAnimal);
}
}
你必须遍历Enum.Getnames(typeof(yourEnum))。
祝你好运。