質問
Enum
型を受け取り、配列内のすべてのメンバーを返すメソッドを作成したいのですが、そのような関数を作成するにはどうすればよいですか?
たとえば、次の2つの列挙型があります:
public enum Family
{
Brother,
Sister,
Father
}
public enum CarType
{
Volkswagen,
Ferrari,
BMW
}
関数 GetEnumList
を作成して返すようにする方法
-
最初のケースでは
-
{Family.Brother、Family.Sister、Family.Father}
。 -
{CarType.Volkswagen、CarType.Ferrari、CarType.BMW}
2番目の場合。
試しました:
private static List<T> GetEnumList<T>()
{
var enumList = Enum.GetValues(typeof(T))
.Cast<T>().ToList();
return enumList;
}
しかし、 InvalidOperationException
が発生しました:
System.InvalidOperationException:ContainsGenericParametersがtrueである型またはメソッドに対して、遅延バインドされた操作を実行できません。 System.Reflection.RuntimeMethodInfo.ThrowNoInvokeException()で System.Reflection.RuntimeMethodInfo.Invoke(オブジェクトobj、BindingFlags invokeAttr、バインダーバインダー、Object []パラメーター、CultureInfoカルチャ、ブール値skipVisibilityChecks) System.Reflection.RuntimeMethodInfo.Invokeで(オブジェクトobj、BindingFlags invokeAttr、バインダーバインダー、Object []パラメーター、CultureInfoカルチャ) System.Reflection.MethodBase.Invoke(Object obj、Object [] parameters)で
編集:上記のコードは正常に機能しています。例外が発生した理由は、プロファイラーがバグを引き起こしたためです。ソリューションに感謝します。
解決
完全なコードは次のとおりです。
public enum Family
{
Brother,
Sister,
Father
}
public enum CarType
{
Volkswagen,
Ferrari,
BMW
}
static void Main(string[] args)
{
Console.WriteLine(GetEnumList<Family>());
Console.WriteLine(GetEnumList<Family>().First());
Console.ReadKey();
}
private static List<T> GetEnumList<T>()
{
T[] array = (T[])Enum.GetValues(typeof(T));
List<T> list = new List<T>(array);
return list;
}
他のヒント
(Family[])Enum.GetValues(typeof(Family))
これが好きですか?
private static List<string> GetEnumList<T>()
{
return Enum.GetNames( typeof( T ) )
.Select(s => typeof(T).Name + "." + s).ToList();
}