C#.NET:Enumに文字列属性を追加

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
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。