投稿者 tel | 2013年9月14日

C#で文字列とEnumを関連付ける

ある文字列からそれに対応するEnumの値をとってくる。

enum Element
{
    None,
    Fire,
    Water,
    Thunder
}

1.Dictionaryを使う

こんな感じでキーを文字列にする。

static readonly Dictionary<string, Element> ElementLabel = new Dictionary<string, Element>
{
    { "無", Element.None },
    { "炎", Element.Fire },
    { "水", Element.Water },
    { "雷", Element.Thunder }
};

// 文字列からenumを取得する
Console.WriteLine(ElementLabel["炎"]); // Fire
  • 新しい要素を追加する場合に2箇所修正しないといけない。
  • 左右に文字列とenumの値が並んでいるので見やすい。
  • 文字列からenumを取得するのは速そう。
  • 対応が存在しない文字列が渡されたときのエラー処理が必要。

2.カスタム属性を使う

enumの値にカスタム属性として文字列をつけておく。

[System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = false, Inherited = false)]
public class LabelAttribute : System.Attribute
{
    public string label;

    public LabelAttribute(string label)
    {
        this.label = label;
    }

    public static T GetEnum<T>(string label) where T : struct, IComparable, IConvertible, IFormattable
    {
        foreach (var e in typeof(T).GetFields())
        {
            var attr = System.Attribute.GetCustomAttribute(e, typeof(LabelAttribute)) as LabelAttribute;

            if (attr != null && attr.label == label)
            {
                return (T)e.GetValue(null);
            }
        }
        return default(T);
    }
}

// enumの各要素にラベルをつける
enum Element
{
    [Label("無")]
    None,
    [Label("炎")]
    Fire,
    [Label("水")]
    Water,
    [Label("雷")]
    Thunder
}

// 文字列からenumを取得する
Console.WriteLine(LabelAttribute.GetEnum<Element>("水")); // Water
  • enumの定義と文字列が同じ場所に書かれているので保守しやすい。
  • コメントとかつけると、ちょっと見難い。
  • たぶん遅い。

3.switch文を使う

Element GetElement(string label)
{
    switch (label)
    {
        case "炎": return Element.Fire;
        case "水": return Element.Water;
        case "雷": return Element.Thunder;
        default: return Element.None;
    }
}
// 文字列からenumを取得する
Console.WriteLine(GetElement("雷")); // Thunder
  • あまり見やすくない。
  • 新しい要素を追加する場合にswitch文とenumの2箇所修正しないといけない。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

カテゴリー

%d人のブロガーが「いいね」をつけました。