【C#】列挙型(enum)の全メンバーを配列として取得する方法:Enum.GetValuesの活用

目次

列挙型の全要素取得

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)) を使用します。

どちらの方法でも、列挙型に定義されたすべての値を配列として取得し、ループ処理などで活用することが可能です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次