C# > enumに文字列を割り当てる。


文字列をEnumっぽく使う - Qiitaの続き
Enum数字に文字列を割り当てます。

エラーコードに文字列を割り当てたいときに使いました。

カスタムAttributeの作成

EnumNameAttribute.csをプロジェクト中のお好きな場所に作成
内容は以下

EnumNameAttribute.cs

using System;

namespace Hoge
{

    /// <summary>
    /// Enumに文字列を付加するためのAttributeクラス
    /// </summary>
    public class StringValueAttribute : Attribute
    {
        /// <summary>
        /// Holds the stringvalue for a value in an enum.
        /// </summary>
        public string StringValue { get; protected set; }

        /// <summary>
        /// Constructor used to init a StringValue Attribute
        /// </summary>
        /// <param name="value"></param>
        public StringValueAttribute(string value)
        {
            this.StringValue = value;
        }
    }



    public static class CommonAttribute
    {

        /// <summary>
        /// Will get the string value for a given enums value, this will
        /// only work if you assign the StringValue attribute to
        /// the items in your enum.
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public static string GetStringValue(this Enum value)
        {
            // Get the type
            Type type = value.GetType();

            // Get fieldinfo for this type
            System.Reflection.FieldInfo fieldInfo = type.GetField(value.ToString());

            //範囲外の値チェック
            if (fieldInfo == null) return null;

            StringValueAttribute[] attribs = fieldInfo.GetCustomAttributes(typeof(StringValueAttribute), false) as StringValueAttribute[];

            // Return the first if there was a match.
            return attribs.Length > 0 ? attribs[0].StringValue : null;

        }
    }
}

enum定義

以下な感じでenumにStringValueアトリビュートを追加します。

    public enum RESULT_CODE
    {
        [StringValue("正常終了")]
        OK = 0, //正常終了-

        [StringValue("エラー1")]
        ERROR1 = 1, //エラー 1

        [StringValue("エラー2")]
        ERROR2 = 2, //エラー 2
    }

使う

    int response = 1;
    var result = (RESULT_CODE) response;
    var resultString = result.GetStringValue();