是否有可能迭代枚举中的每个选择?

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

所以我有一些这样的代码:

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 )与测试中的硬编码列表匹配。 当您添加新值时,使测试失败,然后更新测试以为新值做一些明智的事情(如果针对不同情况的测试实际上需要不同,那么这很有用)。

    还有一种看待它的方法 - switchif链并不是控制代码流的最佳结构。 你可以使用多态性或简单字典来重构它,使其更具可测试性/可扩展性(如何重构这个巨大的switch语句?)。

    链接地址: http://www.djcxy.com/p/16293.html

    上一篇: Is it possible to iterate through each choice in an enum?

    下一篇: Iterate Between Enum Values in C#