可能な重複:
誰もが列挙型ジェネリック制約の欠如に対する良い解決策を知っていますか?
Tを列挙型に束縛する汎用メソッドを作成する
ジェネリック型のパラメータ[私はそれが正しいかどうかわかりません]をEnum
?
たとえば、このようなことをするにはどうすればよいですか?
//VB.NET
Function GetValues(Of T As System.Enum)(ByVal value As T) As IEnumerable(Of T)
Return [Enum].GetValues(value.GetType)
End Function
//C#
public IEnumerable<T> GetValues<T>(T value) where T : System.Enum
{
return Enum.GetValues(value.GetType());
}
更新
私は最終的にJon Skeetの制約のないメロディその目的のために。あなたの貢献に感謝します。
残念ながら、あなたはできません - マイクロソフトでは、この問題を修正しないアイテムとしてクローズしました。
列挙型を構造体として扱い、代わりに制約として使用することができます(Jon Skeetが制約のないメロディ?)それは見苦しいものです。
あなたはできません。代わりの解決法は、struct
ランタイムチェックを実行します。
public IEnumerable<T> GetValues<T>(T value) where T : struct
{
if (!typeof(T).IsEnum) throw new NotSupportedException();
return (IEnumerable<T>)Enum.GetValues(value.GetType());
}
Enum.GetValues
返すArray
(その要素は単にオブジェクトです)、暗黙的にIEnumerable<T>
。 - KeithS
マットとダニーの答えはどちらも答えが半分です。これは実際に必要なものを手に入れます:
public IEnumerable<T> GetValues<T>() where T : struct
{
if (!typeof(T).IsEnum) throw new InvalidOperationException("Generic type argument is not a System.Enum");
return Enum.GetValues(typeof(T)).OfType<T>();
}
ダニーの答えからの変更点:
return Enum.GetValues(typeof(T)).Cast<T>()
- Metro Smurf
この方法で汎用メソッドを汎用化する必要はありません。
あなたはSystem.Enum
あなたの戻り値の型の型パラメータとして:
using System.Linq;
.
.
.
public IEnumerable<Enum> GetValues(Enum value)
{
return Enum.GetValues(value.GetType()).OfType<Enum>();
}
Array
一般的なものではありません)。 - Matt Ellen