4

重複
の可能性: 列挙型を列挙する方法は?

だから私はこのようなコードを少し持っています:

enum Decision
{
  DecisionA,
  DecisionB,
  ...
}

public void DoStuff(Decision d)
{
  switch(d)
  {
    case Decision.DecisionA:
    ....
    ...
  }
}

基本的DoStuffに は、決定が何であれ同じことを行いますが、決定は、それが行うことをより最適化するために使用されます (より高速または何でも)。

ここで、DoStuff の単体テストを実装したいと思います。次のような配列を使用して、すべての決定が適切に機能することをテストするのはかなり簡単ですが、決定new Decision[]{DecisionA, DecisionB, ...};を追加する場合は、戻って手動で単体テストに追加する必要があります。

で指定されたすべての可能なオプションにアクセスすることは可能enumですか? たとえば、次のようなものです。

foreach(var d in Decision.Options)
{
  //d will be DecisionA, and then DecisionB, etc etc
}
4

3 に答える 3

10

を使用できますEnum.GetValuesが、個人的にはあまり好きではありません。キャストする必要があります(たとえば、反復変数の型を指定することにより)、次の方法で型を提供しますtypeof

foreach (Decision decision in Enum.GetValues(typeof(Decision)))
{
}

私はUnconstrained Melodyで利用可能にしたオプションを好みます- 列挙型とデリゲートの拡張メソッドを提供する小さなライブラリです:

foreach (var decision in Enums.GetValues<Decision>())
{
}

これは:

  • 戻り値の型でタイプ セーフ ( を返しますIList<T>)
  • 型引数で型安全 (型は列挙型でなければなりません)
  • すべての呼び出しで同じ読み取り専用リストを再利用するため、より効率的です

もちろん、それは追加のライブラリを使用することを意味します...単一の呼び出しだけでは価値がないかもしれませんが、列挙型で多くのことを行っている場合は、他の機能が役立つ場合があります。

于 2012-11-21T17:07:46.570 に答える
3

System.Enum.GetValuesを使用できます。

于 2012-11-21T17:07:49.697 に答える
1

ジョンの答えはあなたに列挙を与えます、ここでいくつかのランダムなもの...

テストの場合は、別の方法を使用する方がよい場合があります。値のリスト ( Enum.GetValues) がテストでハードコードされたリストと一致することを確認してください。新しい値を追加してテストを更新すると、テストが失敗するようになります (異なるケースのテストが実際に異なる必要がある場合に役立ちます)。

それを見るもう1つの方法 -コードの流れを制御するためswitchのチェーンifは必ずしも最適な構造ではありません。ポリモーフィズムまたは単純な辞書を使用して、よりテスト可能/拡張可能になるようにリファクタリングできる場合があります ( この巨大な switch ステートメントをリファクタリングする方法などのいくつかの質問)。

于 2012-11-21T17:18:01.620 に答える