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のメンバー名を変更しても表示される文字列は変わりません。