Architect's Log

I'm a Cloud Architect. I'm highly motivated to reduce toils with driving DevOps.

Enum値のテキスト変換を拡張メソッドで実装する

Enum値をテキストで表示したいことがたまにあります。
例えば、こんなEnumがあるとします。

enum Hoge : int {
    Foo = 1,
    Bar = 2
}

ありがちな方法

こう書くと、

Console.WriteLine(Hoge.Foo.ToString());
Console.WriteLine(Hoge.Bar.ToString());

このように表示されます。

ですが、私はこの方法には同意しかねます。

どうして?

ToStringの返却値を画面表示等に使用していると、バグの原因になりかねません。

リファクタリング

ToStringはEnumのメンバー名を返すだけですから、メンバー名をリファクタリングすると返す文字列も変わることになります。

難読化

アセンブリを難読化すると、メンバー名が意味不明なものに置換されます。当然返される文字列も意味不明なものになります。

どうすれば?

一案ですが、以下のような拡張メソッドを定義しておき、

static class HogeExtension {
    public static string Text(this Hoge self) {
        switch((int) self) {
            case 1 :
                return "FooText";
            case 2 :
                return "BarText";
            default:
                throw new ArgumentException("未定義のEnum値です。", "Hoge");
        }
    }
}

こう書くと、

Console.WriteLine(Hoge.Foo.Text());
Console.WriteLine(Hoge.Bar.Text());

このように表示されます。

Enumのメンバー名を変更しても表示される文字列は変わりません。