列挙型の全要素取得
C#でenum(列挙型)を使用する際、定義されているすべての選択肢を一覧表示したい場合があります。例えば、コンボボックス(ドロップダウンリスト)の選択肢を生成したり、すべてのステータスに対して一括処理を行ったりするケースです。
C#の標準ライブラリには、列挙型の定義情報を取得するためのSystem.Enumクラスがあり、その中のGetValuesメソッドを使用することで、定義されているすべての値を配列として取得できます。
この記事では、.NET 5以降で利用可能な新しいジェネリックメソッドと、従来のメソッドの両方について解説します。
1. Enum.GetValues<T>() (.NET 5 以降)
.NET 5 (C# 9.0) 以降の環境を使用している場合、ジェネリック版のEnum.GetValues<T>()メソッドを使用するのが最も推奨される方法です。
このメソッドは、指定した列挙型Tの要素を含む、型付きの配列(T[])を返します。キャスト(型変換)が不要で、コードが簡潔になります。
コード例:ユーザー権限の一覧取得
ここでは、システム上のユーザー権限を表すUserRole列挙型を定義し、その全メンバーを取得します。
using System;
public class GenericGetValuesExample
{
public static void Main()
{
Console.WriteLine("--- 権限一覧 (ジェネリック版) ---");
// Enum.GetValues<T>() を使用
// 戻り値は UserRole[] 型になるため、キャストは不要
UserRole[] roles = Enum.GetValues<UserRole>();
foreach (var role in roles)
{
// role は UserRole 型
Console.WriteLine($"Role: {role} (Value: {(int)role})");
}
}
}
/// <summary>
/// ユーザーの権限レベル
/// </summary>
public enum UserRole
{
Guest = 0,
StandardUser = 10,
Moderator = 50,
Administrator = 100
}
出力結果:
--- 権限一覧 (ジェネリック版) ---
Role: Guest (Value: 0)
Role: StandardUser (Value: 10)
Role: Moderator (Value: 50)
Role: Administrator (Value: 100)
2. Enum.GetValues(Type enumType) (従来の方法)
.NET Framework 4.xなどの古い環境では、ジェネリック版が利用できません。その場合は、引数にtypeof(列挙型)を渡す非ジェネリック版のEnum.GetValuesメソッドを使用します。
このメソッドの戻り値はSystem.Array型(オブジェクトの配列)であるため、個々の要素を扱う際にはキャストが必要になる場合がありますが、foreachループで使用する場合は自動的に処理されます。
コード例:配送ステータスの一覧取得
using System;
public class LegacyGetValuesExample
{
public static void Main()
{
Console.WriteLine("--- 配送状況一覧 (従来版) ---");
// Enum.GetValues(typeof(T)) を使用
// 戻り値は Array 型
Array statuses = Enum.GetValues(typeof(ShippingStatus));
foreach (ShippingStatus status in statuses)
{
Console.WriteLine($"Status: {status}");
}
}
}
public enum ShippingStatus
{
Pending,
Processing,
Shipped,
Delivered,
Returned
}
出力結果:
--- 配送状況一覧 (従来版) ---
Status: Pending
Status: Processing
Status: Shipped
Status: Delivered
Status: Returned
補足:名前(文字列)だけを取得したい場合
値(数値)ではなく、定義されている「名前(文字列)」だけの配列が欲しい場合は、Enum.GetNamesメソッドを使用します。
// 名前(string)の配列を取得
string[] roleNames = Enum.GetNames(typeof(UserRole));
// または .NET 5 以降のジェネリック版
// string[] roleNames = Enum.GetNames<UserRole>();
Console.WriteLine(string.Join(", ", roleNames));
出力結果:
Guest, StandardUser, Moderator, Administrator
まとめ
列挙型の全メンバーを取得する方法は、開発環境のバージョンによって使い分けます。
- .NET 5 / .NET Core 以降:
Enum.GetValues<T>()を使用します。型安全で効率的です。 - .NET Framework (古い環境):
Enum.GetValues(typeof(T))を使用します。
どちらの方法でも、列挙型に定義されたすべての値を配列として取得し、ループ処理などで活用することが可能です。
