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 クラスの宣言文がなかったのでソースが不完全でした。
また、使い方も書いていなかったので、自分で見直したときに使い方を忘れていました・・・。だめじゃん。