【C#】EnumのDescriptionからNameまたはValueを返す

EnumのDescriptionからNameまたはValueを返す

使い所さんはあまりないかも。

調べても出てこない(調べ方が下手)なので作りました。

 

実装

namespace Sample
{
    enum NumberEnum
    {
        [Description("Zero0")]
        Zero = 0,
        [Description("One1")]
        One = 1,
        [Description("Two2")]
        Two = 2,
        [Description("Three3")]
        Three = 3
    }

    static class EnumNumber
    {
        public static NumberEnum GetNumberEnum(string key)
        {
            return (NumberEnum)Enum.Parse(typeof(NumberEnum), key);
        }

        public static string GetName(this NumberEnum key)
        {
            return Enum.GetName(typeof(NumberEnum), key);
        }

        public static int GetValue(this NumberEnum key)
        {
            return (int)key;
        }

        public static string GetEnumDescription(this NumberEnum key)
        {
            FieldInfo fi = key.GetType().GetField(key.ToString());
            var attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
            var desciptionString = attributes.Select(n => n.Description).FirstOrDefault();
            if (desciptionString != null)
            {
                return desciptionString;
            }
            return key.ToString();
        }

        public static string GetDescriptionEnumName(string description)
        {
            foreach (NumberEnum Value in Enum.GetValues(typeof(NumberEnum)))
            {
                if (GetEnumDescription(Value) == description)
                {
                    return Enum.GetName(typeof(NumberEnum), Value);
                }
            }
            return ""; // 不一致の場合に返す値
        }

        public static int GetDescriptionEnumValue(string description)
        {
            foreach (NumberEnum Value in Enum.GetValues(typeof(NumberEnum)))
            {
                if (GetEnumDescription(Value) == description)
                {
                    return (int)Value;
                }
            }
            return 0; // 不一致の場合に返す値
        }
    }
    
}

出力結果

?EnumNumber.GetEnumDescription(NumberEnum.One)
"One1"

?EnumNumber.GetDescriptionEnumName("One1")
"One"

?EnumNumber.GetDescriptionEnumValue("One1")
1

最後に

関係ないけどはてなブログってpreタグで囲めばコードハイライト使えるしやっぱ良いですね

あとはゴリ押し実装なのでもっといい方法があると思います。