文字列からenum型の値を取得する - string型からenum型への変換
文字列名からenumの値を取得するコードを紹介します。
UI
下図のUIを準備します。
コード
下記のコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace StringToEnum
{
public partial class FormMain : Form
{
public enum PictureMode { PM_COLOR, PM_MONOCROME, PM_SEPIA, PM_NONE }
public FormMain()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string str = textBox1.Text;
try {
PictureMode pm = (PictureMode)Enum.Parse(typeof(PictureMode), str);
switch (pm) {
case PictureMode.PM_COLOR:
label1.Text = "OK COLOR";
break;
case PictureMode.PM_MONOCROME:
label1.Text = "OK MONOCROME";
break;
case PictureMode.PM_SEPIA:
label1.Text = "OK SEPIA";
break;
case PictureMode.PM_NONE:
label1.Text = "OK NONE";
break;
default:
label1.Text = "NG";
break;
}
}
catch (ArgumentException exc) {
label1.Text = "NG";
}
}
private void button2_Click(object sender, EventArgs e)
{
label1.Text = typeof(PictureMode).FullName;
}
}
}
解説
PictureMode pm = (PictureMode)Enum.Parse(typeof(PictureMode), str);
のEnum.Parseメソッドを用いて文字列からenum値を取得します。第一引数には対象とするenum型のSystem.Typeオブジェクトを与え、第二引数に文字列の値を与えます。戻り値はobject型で戻るためキャストします。
今回はenum型が取得できたかを検証するためにswitch文で取得したenum値を判定しています。
Button2のイベントハンドラはPictureMode列挙型のフルネームを取得するコードです。
実行結果
アプリケーションを実行します。下図の画面が表示されます。
テキストボックスに"PM_MONOCROME"と入力し[Button1]を押します。文字列からPictureMode列挙型の値が取得でき、ラベルにOK MONOCROMEのメッセージが表示されました。
Button2をクリックします。PictureMode列挙型のフルネームがラベルに表示されました。
参考
System.Typeの取得はtypeofを用いますが、列挙型のフルネームの文字列からも取得できます。この場合はType.GetType()メソッドを用います。先のButton1のClickイベントは以下のように記述しても同じ動作をします。
private void button1_Click(object sender, EventArgs e)
{
string str = textBox1.Text;
try {
PictureMode pm = (PictureMode)Enum.Parse(
Type.GetType("StringToEnum.FormMain+PictureMode"), str);
switch (pm) {
case PictureMode.PM_COLOR:
label1.Text = "OK COLOR";
break;
case PictureMode.PM_MONOCROME:
label1.Text = "OK MONOCROME";
break;
case PictureMode.PM_SEPIA:
label1.Text = "OK SEPIA";
break;
case PictureMode.PM_NONE:
label1.Text = "OK NONE";
break;
default:
label1.Text = "NG";
break;
}
}
catch (ArgumentException exc) {
label1.Text = "NG";
}
}
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用