是否有可能在枚举中迭代每个选项?

Ear*_*rlz 1 .net c# enums unit-testing

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

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

enum Decision
{
  DecisionA,
  DecisionB,
  ...
}

public void DoStuff(Decision d)
{
  switch(d)
  {
    case Decision.DecisionA:
    ....
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

基本上DoStuff,无论做出什么决定,都会做同样的事情,但决定是用来做出更优化的事情(更快或更好).

现在,我想为DoStuff实现单元测试.通过使用类似的数组来测试所有Decisions是否正常工作相当容易.new Decision[]{DecisionA, DecisionB, ...};但是,如果我添加一个决定,那么我必须返回并手动将其添加到单元测试中.

是否可以只访问由a指定的所有可能选项enum?例如,像这样:

foreach(var d in Decision.Options)
{
  //d will be DecisionA, and then DecisionB, etc etc
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 10

你可以使用Enum.GetValues,但就我个人而言,我并不是一个忠实的粉丝.你需要强制转换(例如通过指定迭代变量类型),并通过typeof以下方式提供类型:

foreach (Decision decision in Enum.GetValues(typeof(Decision)))
{
}
Run Code Online (Sandbox Code Playgroud)

我更喜欢我在Unconstrained Melody中提供的选项- 一个在枚举和代表上提供扩展方法的小库:

foreach (var decision in Enums.GetValues<Decision>())
{
}
Run Code Online (Sandbox Code Playgroud)

这是:

  • 返回类型的类型安全(它返回一个IList<T>)
  • 类型安全的类型参数(类型必须是枚举)
  • 更高效,因为它为所有调用重用相同的只读列表

当然它确实意味着使用一个额外的库...它可能不值得你只为一个电话,但如果你用枚举做很多事情,你可能会发现其他功能有用.