enumに属性を追加して、追加した属性から表示用の文字列を取得する方法です。
属性クラス
DisplayTextAttribute.cs
using System;
namespace WindowsFormsApplication2
{
[AttributeUsage(AttributeTargets.Field)]
class DisplayTextAttribute : Attribute
{
/// <summary>
/// 表示文字列
/// </summary>
public string DisplayText { get; private set; }
/// <summary>
/// コンストラクタ
/// </summary>
/// <param name="displayText">表示文字列</param>
public DisplayTextAttribute(string displayText)
{
this.DisplayText = displayText;
}
}
}
属性に設定した値を取り出すためのメソッドを定義したクラス
Ext.cs
using System;
using System.Linq;
namespace WindowsFormsApplication2
{
static class Ext
{
public static string GetDisplayText(this Enum enumValue)
{
// enumに定義されているかを判定
var fieldInfo = enumValue.GetType().GetField(enumValue.ToString());
if (fieldInfo == null)
{
// enumにに定義されていない場合
return string.Empty;
}
// DisplayText属性が設定されているかを判定
var displayAttribute = fieldInfo
.GetCustomAttributes(typeof(DisplayTextAttribute), false)
.Cast<DisplayTextAttribute>();
if (!displayAttribute.Any())
{
// DisplayText属性が設定されていない場合
return string.Empty;
}
return displayAttribute.First().DisplayText;
}
}
}
使うとき
使用するときは、
①「DisplayTextAttribute」と「Ext」を同じnamespaceに置くか、
②usingに「DisplayTextAttribute」と「Ext」のnamespaceを追加すればOK
例)MessageBoxにDisplayTextの値を表示
Form1.cs
using System.Windows.Forms;
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
private enum ValueEnum
{
[DisplayText("あいう")]
Val1,
[DisplayText("えお")]
Val2 = 2,
Val3 = 3,
}
public Form1()
{
InitializeComponent();
// "あいう"が表示される
MessageBox.Show(ValueEnum.Val1.GetDisplayText());
// "えお"が表示される
MessageBox.Show(ValueEnum.Val2.GetDisplayText());
// 空欄(string.Empty)が表示される ※DisplayText属性が設定されていない
MessageBox.Show(ValueEnum.Val3.GetDisplayText());
// 空欄(string.Empty)が表示される ※enumに定義されていない
MessageBox.Show(((ValueEnum)4).GetDisplayText());
}
}
}
最終更新:2014年01月25日 11:12