可能性のある複製:
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
クラスのメンバーとメソッドにしかアクセスできません。それで、私が意図した方法で実装したり、他のアプローチを使用する必要がありますか?
いいえ、残念ながらできません。できる最善の方法は_where T : struct, IComparable, IConvertible, IFormattable
_を使用することです(もちろん同じではありません)。インターフェイスの制限は、 _System.Enum
_ の実装から派生しています。
それとは別に、実行時に問題を検出し、おそらく例外をスローできるtypeof(T).IsEnum
かどうかを確認できます。ただし、コンパイル時にこの制限を強制する方法はありません。
これはC#の言語レベルでは実行できませんが、基になるCLRでサポートされています。 Jon Skeetの nconstrained Melody を使用できます。これにより、生成されたバイナリが実際の列挙ジェネリック制約を持つバイナリに変換されます。