Enum クラス

id:siokoshou:20080124 に続いて再び enum ネタ。偶然すばらしいものを発見してしまったので。

ネタ元 : http://devlicious.com/blogs/christopher_bennage/archive/2007/09/13/my-new-little-friend-enum-lt-t-gt.aspx

こないだは enum の具体的な実装、例えば enum MyEnum としたときの MyEnum と拡張メソッドは相性がいいってネタだったけど、今回は Enum クラスのメソッド Parse とかをきれいに書くネタ。

Parse よく使いますが、見た目が汚いんですよね。ネタ元から引用すると

MyEnum enumValue = (MyEnum) Enum.Parse(typeof (MyEnum), stringValue);

これを Enum クラスでくるんでしまってきれいにするという卓越したアイデア。再び引用。

MyEnum enumValue = Enum<MyEnum>.Parse(stringValue);

スッキリ! Enum の実装も引用。

public static class Enum<T>
{
  public static T Parse(string value)
  {
    return (T) Enum.Parse(typeof (T), value);
  }

  public static IList<T> GetValues()
  {
    IList<T> list = new List<T>();
    foreach (object value in Enum.GetValues(typeof (T)))
    {
      list.Add((T) value);
    }
    return list;
  }
}

すばらしすぎ! class Enum と class Enum がそれぞれ存在できるっていう目の付け所がイイ。標準に入れてもらいたいところ。
where T : enum と制約できれば最高なんだけどそれは無理なので、struct 制約つけたり、static コンストラクタで T が enum かチェックしたりすればもっとよいかも。あとは残りのメソッドを一つずつくるんでいけばOK。
GetValues() などは LINQ なら一行で書けるので LINQ の練習にどうぞ。
でも、速度の問題は未解決(-_-)。