web-dev-qa-db-ja.com

C#で列挙型をジェネリック型パラメーターとして使用

可能性のある複製:
C#の列挙型制約

ラッパークラスenumを使用して、Enum型を汎用パラメーターとして使用できますか?

私は異なる列挙型を持っています:

enum errors1 { E1, E3, E8 };
enum errors2 { E0, E2, E9 };
enum errors3 { E7, E4, E5 };

次のクラス宣言で、私はそれを達成できると思った:

public class MyErrors<T> where T : Enum
{
   T enumeration;

   public T getEnumeration()
   {
       return enumeration;
   }

   static void Main(string[] args)
   {

       Program<error1> p = new Program<error1>();
       p.getEnumeration().E1  // this call does NOT work
   }

ただし、一般的な型はEnumなので、Enumクラスのメンバーとメソッドにしかアクセスできません。それで、私が意図した方法で実装したり、他のアプローチを使用する必要がありますか?

34
Konrad Reiche

いいえ、残念ながらできません。できる最善の方法は_where T : struct, IComparable, IConvertible, IFormattable_を使用することです(もちろん同じではありません)。インターフェイスの制限は、 _System.Enum_ の実装から派生しています。

それとは別に、実行時に問題を検出し、おそらく例外をスローできるtypeof(T).IsEnumかどうかを確認できます。ただし、コンパイル時にこの制限を強制する方法はありません。

42
Jon

これはC#の言語レベルでは実行できませんが、基になるCLRでサポートされています。 Jon Skeetの nconstrained Melody を使用できます。これにより、生成されたバイナリが実際の列挙ジェネリック制約を持つバイナリに変換されます。

12
Mehrdad Afshari