いまさら聞けないカスタム属性
enumのフィールドに対応する日本語リテラルを付加するためのカスタム属性を書く
/// <summary> /// 元号 /// </summary> private enum Gengo { 明治, 大正, 昭和, 平成 }
enumのフィールドは、上記のように日本語で指定することも、もちろん可能なんだけど、
コードの中に日本語が入り混じるのは、違和感ありまくりんぐなので、個人的にはあんまりやりたくないわけです。
そんなときはカスタム属性を作成して、enumフィールドにメタデータを持たしちゃいましょう。
/// <summary> /// 列挙型のフィールドに日本語リテラルを付加するためのカスタム属性 /// </summary> [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = false)] public class EnumLiteralAttribute : Attribute { /// <summary>リテラル</summary> private string literal; /// <summary> /// コンストラクタ /// </summary> /// <param name="literal">リテラル</param> public EnumLiteralAttribute(string literal) { this.literal = literal; } /// <summary> /// 属性で指定されたEnumのリテラルを取得します。 /// </summary> /// <param name="value">Enum型の値</param> /// <returns>リテラル</returns> public static string GetLiteral(Enum value) { Type t = value.GetType(); string name = Enum.GetName(t, value); FieldInfo fi = t.GetField(name); EnumLiteralAttribute[] items = (EnumLiteralAttribute[])fi.GetCustomAttributes(typeof(EnumLiteralAttribute), false); return items[0].literal; } }
んで、例えばこんな風にenumのフィールドにメタデータを付加する。
/// <summary> /// 元号 /// </summary> private enum Gengo { [EnumLiteral("明治")] Meiji, [EnumLiteral("大正")] Taisho, [EnumLiteral("昭和")] Showa, [EnumLiteral("平成")] Heisei }
そんでもって、日本語リテラルが欲しければ、
enum の値からメタデータのリテラルを取り出せばおっけー。
foreach (Gengo g in Enum.GetValues(typeof(Gengo))){ Console.WriteLine(EnumLiteralAttribute.GetLiteral(g)); }
実行結果
明治
大正
昭和
平成
____ / \ / ─ ─\ / (●) (●) \ | (__人__) | これは使わない手はないお / ∩ノ ⊃ / ( \ / _ノ | | \ “ /__| | \ /___ /