【C#】属性(アトリビュート) ~カスタム属性~

■ カスタム属性:属性の自作

作成ポイント

 * System.Attirbuteクラスを継承すること
 * 属性に引数を付けるには、引数を持ったコンストラクタを用意すること

■ サンプル

http://d.hatena.ne.jp/lord_hollow/20110121
http://igeta.cocolog-nifty.com/blog/2007/11/enum_string.html
を参考に実用的なenumに関する処理を記述する
カスタム属性以外では、拡張メソッドも使っている(.NET3.5以上)
http://blogs.yahoo.co.jp/dk521123/22569878.html
以下の関連記事の「数値からEnumに変換」と併せて実装すれば、Enumの処理が綺麗になる感じ。
http://blogs.yahoo.co.jp/dk521123/29496843.html

Gender.cs

/// <summary>
/// 性別
/// </summary>
public enum Gender : byte
{
    [EnumAttribute(0, "不明")]
    None,
    [EnumAttribute(1, "男性")]
    Male,
    [EnumAttribute(2, "女性")]
    Female,
}

EnumAttribute.cs

/// <summary>
/// Enum属性
/// </summary>
/// <remarks>使い回し可</remarks>
public class EnumAttribute : Attribute
{
    private byte code;
    private string text;

    public EnumAttribute(byte code, string text)
    {
        this.code = code;
        this.text = text;
    }

    /// <summary>
    /// コード
    /// </summary>
    public byte Code
    {
        get
        {
            return this.code;
        }
    }
    /// <summary>
    /// 文言
    /// </summary>
    public string Text
    {
        get
        {
            return this.text;
        }
    }
}

/// <summary>
/// Enum拡張クラス
/// </summary>
/// <remarks>使い回し可</remarks>
public static class EnumExtention
{
    /// <summary>
    /// 属性で指定された文言を取得する。
    /// </summary>
    /// <param name="value">列挙型</param>
    /// <returns>文言</returns>
    public static string ToText(this Enum value)
    {
        EnumAttribute attribute = EnumExtention.GetAttribute(value);
        return attribute.Text;
    }
    /// <summary>
    /// 属性で指定されたコードを取得する。
    /// </summary>
    /// <param name="value">列挙型/param>
    /// <returns>コード</returns>
    public static byte ToCode(this Enum value)
    {
        EnumAttribute attribute = EnumExtention.GetAttribute(value);
        return attribute.Code;
    }

    private static EnumAttribute GetAttribute(Enum value)
    {
        Type enumType = value.GetType();
        string name = Enum.GetName(enumType, value);
        EnumAttribute[] attributes =
            (EnumAttribute[])enumType.GetField(name)
            .GetCustomAttributes(typeof(EnumAttribute), 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;
    }
    this.label1.Text = sex.ToCode() + sex.ToText();
}