是否有可能迭代枚举中的每个选择?
可能重复:
如何枚举枚举?
所以我有一些这样的代码:
enum Decision
{
DecisionA,
DecisionB,
...
}
public void DoStuff(Decision d)
{
switch(d)
{
case Decision.DecisionA:
....
...
}
}
基本上DoStuff
无论做什么决定都会做同样的事情,但决定是用来做出更优化的(更快或者其他)。
现在,我想为DoStuff实施单元测试。 通过拥有像new Decision[]{DecisionA, DecisionB, ...};
这样的数组来测试所有决策是否正常工作是相当容易的new Decision[]{DecisionA, DecisionB, ...};
但是,如果我添加一个决定,那么我必须返回并手动将其添加到单元测试。
是否可以访问enum
指定的所有可能的选项? 例如,像这样的东西:
foreach(var d in Decision.Options)
{
//d will be DecisionA, and then DecisionB, etc etc
}
你可以使用Enum.GetValues
,但是我个人并不是那么喜欢的。 你需要施放(例如通过指定迭代变量类型),并通过typeof
提供类型:
foreach (Decision decision in Enum.GetValues(typeof(Decision)))
{
}
我更喜欢我在Unconstrained Melody中提供的选项 - 一个为枚举和代表提供扩展方法的小型库:
foreach (var decision in Enums.GetValues<Decision>())
{
}
这是:
IList<T>
) 当然,它的确意味着使用一个额外的库......它可能不值得为你一个电话,但如果你用枚举做了很多事情,你可能会发现其他功能很有用。
您可以使用System.Enum.GetValues。
乔恩的回答给你列举了一些更随机的东西......
对于测试来说,这可能是更好的方法 - 确保值列表( Enum.GetValues
)与测试中的硬编码列表匹配。 当您添加新值时,使测试失败,然后更新测试以为新值做一些明智的事情(如果针对不同情况的测试实际上需要不同,那么这很有用)。
还有一种看待它的方法 - switch
和if
链并不是控制代码流的最佳结构。 你可以使用多态性或简单字典来重构它,使其更具可测试性/可扩展性(如何重构这个巨大的switch语句?)。
上一篇: Is it possible to iterate through each choice in an enum?