enum(列挙型)のフィールド名(メンバー名、列挙子)からenum(列挙型)の値を取得する方法について紹介します。
enum(列挙型)とは、複数のフィールド(変数)をひとつにまとめて、一連の整数値を付けることができる型のことです。
enum(列挙型)で定義されるフィールド(変数)は、メンバーや列挙子(リスト)などと呼ばれます。
enum(列挙型)は、ユーザー(開発者)が独自に定義することができます。
また、System名前空間にあるDayOfWeekなどのように、.NETにあらかじめ用意されているものもあります。
目次
enum(列挙型)の値を文字列から取得
enum(列挙型)の値を文字列(フィールド名)から取得するには、System名前空間にあるEnumクラスのParse静的メソッド、またはTryParse静的メソッドを使用します。
Parse静的メソッドの構文
Parse静的メソッドは、パラメーター(引数)に値を取得するenum(列挙型)の型(Type)と、変換する元になる文字列(フィールド名)を取ります。
戻り値には、変換したenum(列挙型)の値(フィールド値)を返します。
1 2 3 |
// Parse静的メソッドの構文 [System.Runtime.InteropServices.ComVisible(true)] public static object Parse (Type enumType, string value); |
enumの型と文字列の2つのパラメーターを指定するParse静的メソッドは、指定された文字列に完全に一致する(大文字と小文字は区別される)フィールド(メンバー)を探して変換します。
指定された文字列がenum(列挙型)に変換できない場合は、「System.ArgumentException: 要求された値 ‘[指定した文字列]’ が見つかりませんでした。」という例外を発生させます。
Parse静的メソッドには、大文字と小文字を区別するかどうかを指定するオーバーロードも用意されています。
1 2 3 |
// Parse静的メソッドの構文 [System.Runtime.InteropServices.ComVisible(true)] public static object Parse (Type enumType, string value, bool ignoreCase); |
大文字と小文字を区別しない場合は3番目のパラメーターのignoreCaseにTrueを指定します。
TryParse静的メソッドの構文
TryParse静的メソッドは、型パラメーター(型引数)に値を取得するenum(列挙型)を取り、パラメーター(引数)に変換する元になる文字列(フィールド名)と、変換結果のenum(列挙型)の値(フィールド値)を取ります。
戻り値には変換できたかどうかを示す値をbool型の真偽値(True/False)で返します。
1 2 |
// TryParse静的メソッドの構文 public static bool TryParse<TEnum> (string value, out TEnum result) where TEnum : struct; |
上記の構文のTryParse静的メソッドは、文字列が完全に一致する(大文字と小文字は区別される)場合にTrueを返し、outキーワードを指定したパラメーター(引数)に変換後のフィールド値を返します。
TryParse静的メソッドにも、Parse静的メソッドと同様に、大文字と小文字を区別するかどうかを指定するオーバーロードも用意されています。
1 2 |
// TryParse静的メソッドの構文 public static bool TryParse<TEnum> (string value, bool ignoreCase, out TEnum result) where TEnum : struct; |
TryParse静的メソッドでは、2番目のパラメーターのignoreCaseに大文字と小文字を区別するかどうかを示す値をbool値で指定します。
サンプルプログラム
ユーザー定義の列挙型(CustomEnum)とSystem.Windows.Forms名前空間にあるFormStartPosition列挙型を使って、フィールド名を表す文字列からフィールド値を取得します。
VisualStudioでWindowsフォームアプリケーションのプロジェクトを作成します。
Windowsフォームアプリケーションのプロジェクトを作成する方法については、以下の記事を参照してください。
ユーザーインターフェース(画面デザイン)
フォームを作成し、enum(列挙型)のフィールド名を表す文字列を入力するテキストボックス(textBox1)と、列挙型の種類を選択するラジオボタンを2つ(radioButton1, radioButton2)と、文字列をフィールド値に変換するボタン(button1)を配置します。ボタンの横には、変換結果を表示するラベルを用意します。
ソースコード
ボタンがクリックされた時のイベント処理をコーディングします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApp1 { public partial class Form1 : Form { // コンストラクタ public Form1() { InitializeComponent(); // FormStartPosition列挙型を選択 this.radioButton1.Checked = true; } // ボタンクリックイベント private void button1_Click(object sender, EventArgs e) { try { // テキストボックスの値(列挙型のフィールド名)を取得 string stringValue = this.textBox1.Text; int intValue = -1; if (this.radioButton1.Checked) { // Parse静的メソッドで文字列から列挙値を取得 object enumValue = Enum.Parse(typeof(FormStartPosition), stringValue); // Parse静的メソッドで変換できない場合は例外が発生する FormStartPosition formStartPosition = (FormStartPosition)enumValue; intValue = (int)formStartPosition; } else { // TryParse静的メソッドで文字列から列挙値を取得 bool canParse = Enum.TryParse<CustomEnum>(stringValue, out CustomEnum customEnum); if (!canParse) { throw new ApplicationException("CustomEnum列挙型に変換できませんでした。"); } intValue = (int)customEnum; } // ラベルに表示 this.label1.Text = $"Value: {intValue}"; } catch (Exception ex) { MessageBox.Show(ex.Message); } } } // ユーザー定義のカスタム列挙型 public enum CustomEnum { Zero, One, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten } } |
上記のソースコードでは、指定した文字列が完全に一致する場合にenum(列挙型)の値を返すようにしています。
サンプルプログラムの実行
プロジェクトをビルドして実行(デバッグ)します。
テキストボックスにenum(列挙型)のフィールド名(メンバー名)を入力してボタンをクリックします。
変換された値がボタンの横のラベルに表示されます。