C#でEnumをタイプセーフに・・・

C#のEnumはとっても便利。


でも、通信プログラムなんかでは、列挙値と数値や文字列との相互変換が必要だったりする。
System.Enum のParse関数はそれを上手くやってくれるんだけど、ちょっと不満。


たとえば、

public enum Gender {
Male = 1,
Female = 2
};


という列挙を宣言したとき。

Gender X = (Gender)Enum.Parse(typeof(Gender),"9")


なんてコードが実行時にもエラーにならないんです!
キャストしまくってるのでコンパイル時にエラーが補足できないのはしょうがないとしても、実行時には列挙されていない値は・・・なんとかしろよぉ!
ということで、以下の関数をつくりました。

public class EnumUtility<T>
{
public static T GetEnumObject(string value)
{
if (!typeof( T).IsEnum)
throw new ArgumentException("T Must be an Enum");

int intvalue; //TryParse用のダミー

if (!int.TryParse(value,out intvalue))
throw new ArgumentException("Value must be a numeric value");

T result = ( T)Enum.Parse( typeof( T), value);

if (int.TryParse(result.ToString(), out intvalue))
throw new ArgumentException("Enum Value not found");

return result;
}
}


使い方は、 EnumUtility<Gender>.GetEnumObject("9")のように呼び出すだけです。

このとき引数で渡された文字列が列挙値に存在しない場合、ArgumentExceptionがThrowされます。

 

いかがでしょう?

 

 

修正:2010/06/16 クラスの宣言文がなかったのでソースが不完全でした。

また、使い方も書いていなかったので、自分で見直したときに使い方を忘れていました・・・。だめじゃん。