【C#入門】enumの値を文字列に変換する方法(属性の定義も解説)

enumって使ってますか?enumは列挙型といって、複数の名前に一連の整数値を付ける必要がある場合に使用すると便利です。例えばswitch-case文のcaseの値などに使用されることがよくあります。

enumで定義した複数の名前のことを列挙子といいますが、列挙子を数値ではなく名前、つまり文字列で扱いたい場合も多くあります。この記事では、enumの使い方、enumの列挙子を文字列で取得する方法について

  • enumとは
  • enumの使い方
  • 列挙子の数値を取得する方法
  • 列挙子の値を文字列で取得する方法

という基本的な内容から、列挙子に別の名前を付けて取得する方法など応用的な使い方の内容についても解説していきます。今回はenumの使い方、enumの列挙子を文字列で取得する方法についてわかりやすく解説します!

目次

enumとは

enumキーワードは、列挙型を宣言するために使います。列挙型とは、名前の付いた定数の集まりです。列挙型で定義される定数は列挙子リストと呼ばれます。

デフォルトでは列挙子に、0(ゼロ)から順に整数値が付けられます。付ける整数値の型は、byte、sbyte、short、ushort、int、uint、long、またはulongに限られています。最初の値を0(ゼロ)以外で定義することも可能です。

また、列挙子リストの途中から付ける整数値を変えることもできます。

enumの使い方

enumの使い方についてみていきましょう。

enumを定義する方法

enumは以下のように定義します。

enum オブジェクト名 {列挙子1, 列挙子2, ・・・};

列挙子の名前には、英数字を使うことはもちろんですが、日本語を指定することもできます。

ただし、列挙子の名前に空白を使用することはできませんので、注意しましょう。enumの定義の例をみてみましょう。

enum Days {
    Mon,
    Tue,
    Wed,
    Thu,
    Fri,
    Sat,
    Sun
 }

以下のように列挙子は日本語でも定義できます。

enum Days {
    月曜日,
    火曜日,
    水曜日,
    木曜日,
    金曜日,
    土曜日,
    日曜日
 }

列挙子のデフォルトの型はint型ですが、別の型を指定する場合は以下のように指定します。また、初期化子を使って以下のように定数の値を変更することもできます。

enum Days : byte{
    Mon = 1,
    Tue,
    Wed,
    Thu,
    Fri,
    Sat = 11,
    Sun
 }

初期化子を変更すると変更した値から順に定数の値が付けられます。この場合は例えばTueには2が、Wedには3というように定数が付けられます。

switch文で使う方法

enumはswitch-case文とあわせてよく使われます。caseの値にenumの列挙子を指定することで、条件の場合分けが読みやすくなります。サンプルコードで確認しましょう。

using System;

namespace Sample
{
  // enumの定義
  enum Days {
    Mon,
    Tue,
    Wed,
    Thu,
    Fri,
    Sat,
    Sun
  }
  
  class Sample
  {
    static void Main()
    {
      Days day = Days.Wed;
      
      switch(day) {
        case Days.Mon:
        case Days.Tue:
        case Days.Wed:
        case Days.Thu:
        case Days.Fri:
          Console.WriteLine("平日です");
          break;
        case Days.Sat:
        case Days.Sun:
          Console.WriteLine("休日です");
          break;
        default:
          Console.WriteLine("不正です");
          break;
      }
      
      Console.ReadKey();
    }
  }
}

実行結果:

平日です

列挙子の数値を取得する方法

列挙子の数値を取得するには列挙子に指定した型でキャストします。サンプルコードで確認しましょう。

using System;

namespace Sample
{
  // enumの定義
  enum Days : byte{
    Mon = 1,
    Tue,
    Wed,
    Thu,
    Fri,
    Sat = 11,
    Sun
  }
  
  class Sample
  {
    static void Main()
    {
      Days day = Days.Wed; 
      Console.WriteLine("{0}の定数の値は{1}", day, (byte)day);
      
      Console.ReadKey();
    }
  }
}

実行結果:

Wedの定数の値は3

列挙子の値を文字列で取得する方法

enumの列挙子の値を文字列で使いたいという機会は多くあります。いくつか方法がありますので、みていきましょう。

ToStringを使う方法

ToStringメソッドを使うと列挙子を文字列に変換することができます。サンプルコードでToStringメソッドの使い方を確認しましょう。

using System;

namespace Sample
{
  // enumの定義
  enum Days : byte{
    Mon = 1,
    Tue,
    Wed,
    Thu,
    Fri,
    Sat = 11,
    Sun
  }
  
  class Sample
  {
    static void Main()
    {
      Days day = Days.Wed; 
      string dayName = day.ToString();
      Console.WriteLine(dayName);
      
      Console.ReadKey();
    }
  }
}

実行結果:

Wed

GetNameを使う方法

EnumクラスのGetNameメソッドを使って、列挙子を文字列に変換する方法もあります。サンプルコードで確認しましょう。

using System;

namespace Sample
{
  // enumの定義
  enum Days : byte{
    Mon = 1,
    Tue,
    Wed,
    Thu,
    Fri,
    Sat = 11,
    Sun
  }
  
  class Sample
  {
    static void Main()
    {
      Days day = Days.Wed;
      string dayName = Enum.GetName(typeof(Days), day);
      Console.WriteLine(dayName);
      
      Console.ReadKey();
    }
  }
}

実行結果:

Wed

列挙子リストの全ての名前を取得する方法

EnumクラスのGetNamesメソッドを使うと、列挙子リストの全ての名前を取得することができます。サンプルコードで確認しましょう。

using System;

namespace Sample
{
  // enumの定義
  enum Days : byte{
    Mon = 1,
    Tue,
    Wed,
    Thu,
    Fri,
    Sat = 11,
    Sun
  }
  
  class Sample
  {
    static void Main()
    {
      string[] dayNames = Enum.GetNames(typeof(Days));
      Console.WriteLine("[{0}]", string.Join(", ", dayNames));
      
      Console.ReadKey();
    }
  }
}

実行結果:

[Mon, Tue, Wed, Thu, Fri, Sat, Sun]

列挙子に別の名前を付けて取得する方法

列挙子に別の名前を付けて呼び出すこともできます。いくつか方法がありますので、みていきましょう。

配列、拡張メソッドを使う方法

拡張クラスを定義し、拡張メソッドを使って、ToStringメソッドと同じように呼び出せるようにしてみましょう。

using System;

namespace Sample
{
  // enumの定義
  enum Days {
    Mon,
    Tue,
    Wed,
    Thu,
    Fri,
    Sat,
    Sun
  }
  
  // 拡張クラス
  static class Sample
  {
    static void Main()
    {
      Days day = Days.Wed;
      Console.WriteLine("{0}は{1}", day.ToString(), day.GetName());
      
      Console.ReadKey();
    }
    
    // 拡張メソッド
    static string GetName(this Days day) {
      string[] dayNames = {"月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日", "日曜日"};
      return dayNames[(int)day];
    }
  }
}

実行結果:

Wedは水曜日

Dictionaryを使う方法

拡張メソッドを使わずにDictionaryを使う方法もあります。サンプルコードで確認しましょう。

using System;
using System.Collections.Generic;

namespace Sample
{
  // enumの定義
  enum Days {
    Mon,
    Tue,
    Wed,
    Thu,
    Fri,
    Sat,
    Sun
  }
  
  class Sample
  {
    static void Main()
    {
      var myTable = new Dictionary<string, string>()
        {
          {"Mon", "月曜日"},
          {"Tue", "火曜日"},
          {"Wed", "水曜日"},
          {"Thu", "木曜日"},
          {"Fri", "金曜日"},
          {"Sat", "土曜日"},
          {"Sun", "日曜日"}
        };
      
      Days day = Days.Wed;
      string dayName = day.ToString();
      Console.WriteLine("{0}は{1}", dayName, myTable[dayName]);
      
      Console.ReadKey();
    }
  }
}

実行結果:

Wedは水曜日

Dictionaryの使い方については、こちらで詳しく解説していますので、ぜひ参考にしてください。

属性を定義する方法

属性で別の名前を定義して呼び出す方法もあります。属性とはクラスやenumの列挙子などに付与するメタ情報のことです。列挙子などの「[ ]」を使って付与します。

拡張メソッドで取得できるようにしてみましょう。

using System;
using System.ComponentModel;

namespace Sample
{
  // enumの定義
  enum Days {
    [Description("月曜日")]
    Mon,
    [Description("火曜日")]
    Tue,
    [Description("水曜日")]
    Wed,
    [Description("木曜日")]
    Thu,
    [Description("金曜日")]
    Fri,
    [Description("土曜日")]
    Sat,
    [Description("日曜日")]
    Sun
  }
  
  // 拡張クラス
  static class Sample
  {
    static void Main()
    {
      Days day = Days.Wed;
      Console.WriteLine("{0}は{1}", day.ToString(), day.GetName());
      
      Console.ReadKey();
    }
    
    // 拡張メソッド
    static string GetName(this Days day) {
      var gm = day.GetType().GetMember(day.ToString());
      var attributes = gm[0].GetCustomAttributes(typeof(DescriptionAttribute), false);
      var description = ((DescriptionAttribute)attributes[0]).Description;
      return  description;
    }
  }
}

実行結果:

Wedは水曜日

まとめ

ここでは、enumの使い方、enumの列挙子を文字列で取得する方法について説明しました。enumの列挙子を文字列で取得する方法については、いくつか方法がありますので、使いこなすことができるように、この記事を何度も参考にして下さいね!

この記事を書いた人

熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。
お問合せはこちらでも受け付けています。
info@sss-lab.com

目次