【C#】列挙型・Enum ~ Enumの文字列化 ~

Enumの文字列化

https://blogs.yahoo.co.jp/dk521123/29483903.html
で「アトリビュート」と「拡張メソッド」(それぞれの技術説明は下記「関連記事」参照)で作成したが
1つのEnumに対して、1つの文字列化メソッドを作成しなくてはならない

そこで、使い回しができるように、
http://igeta.cocolog-nifty.com/blog/2007/11/enum_string.html
を参考に「アトリビュート」と「可変長引数」を使用して作成する

■ サンプル

Gender.cs

/// <summary>
/// 性別
/// </summary>
public enum Gender
{
    [EnumTextAttribute("Unknown", "N")] // 独自でアトリビュートを作成(下記参照)
    None,
    [EnumTextAttribute("Male", "M")]
    Male,
    [EnumTextAttribute("Female", "F")]
    Female,
}

EnumTextAttribute.cs

/// <summary>
/// Enum属性
/// </summary>
/// <remarks>使い回し可</remarks>
public class EnumTextAttribute : Attribute
{
    private string[] texts;

    public EnumTextAttribute(params string[] texts)
    {
        this.texts = texts;
    }

    /// <summary>
    /// 文言リスト
    /// </summary>
    public string[] Texts
    {
        get
        {
            return this.texts;
        }
    }
}

EnumHelper.cs

/// <summary>
/// Enumヘルパークラス
/// </summary>
/// <remarks>使い回し可</remarks>
public static class EnumHelper
{
    /// <summary>
    /// 属性で指定された文言を取得する。
    /// </summary>
    /// <param name="value">列挙型</param>
    /// <returns>文言</returns>
    public static string ToText(this Enum value)
    {
        return EnumHelper.ToText(value, 0);
    }

    /// <summary>
    /// 属性で指定された文言を取得する。
    /// </summary>
    /// <param name="value">列挙型</param>
    /// <param name="index">インデックス番号</param>
    /// <returns>文言</returns>
    public static string ToText(this Enum value, int index)
    {
        EnumTextAttribute attribute = EnumHelper.GetEnumTextAttribute(value);
        return attribute.Texts[index];
    }

    /// <summary>
    /// 属性で指定されたEnum属性クラスを取得する。
    /// </summary>
    /// <param name="value">列挙型</param>
    /// <returns>Enum属性</returns>
    private static EnumTextAttribute GetEnumTextAttribute(Enum value)
    {
        Type enumType = value.GetType();
        string name = Enum.GetName(enumType, value);
        EnumTextAttribute[] attributes =
            (EnumTextAttribute[])enumType.GetField(name)
            .GetCustomAttributes(typeof(EnumTextAttribute), false);
        return attributes.FirstOrDefault();
    }
}

使い方の例

private void button1_Click(object sender, EventArgs e)
{
    Gender sex;
    switch (this.textBox1.Text)
    {
        case "1":
            sex = Gender.Male;
            break;
        case "2":
            sex = Gender.Female;
            break;
        default:
            sex = Gender.None;
            break;
    }
    int index;
    if (int.TryParse(this.textBox2.Text, out index))
    {
         this.label1.Text = sex.ToText(index);
    }
    else
    {
         this.label1.Text = sex.ToText();
    }
}