型で指定する必要があるジェネリック型がありますEnum
(実際には、指定されたいくつかの列挙型の 1 つですが、 で解決しますSystem.Enum
)。
もちろん、コンパイラは次のようなコードには抵抗します。
class Generic<T> where T : Enum {}
「制約を特別なクラス 'System.Enum' にすることはできません」という例外があります。
これまでに思いついた唯一の解決策は、静的型初期化子を使用して型パラメーターを調べ、実際には列挙型でない場合は次のように例外をスローすることです。
class Generic<T>
{
static Generic()
{
if (typeof(T).BaseType != typeof(Enum))
throw new Exception("Invalid Generic Argument");
}
}
これにより、少なくとも列挙型以外のパラメーターを使用しないというランタイム セキュリティが得られます。ただし、これは少しハッキリしているように感じます。理想的にはコンパイル時の構成を使用して、これを達成するためのより良い方法はありますか?