はじめに
毎回「あれ、どう書くんだっけ」と調べているので、まとめておこうと思います。
// 各サンプルコードで使用するEnumpublicenumSeasons{Spring,Summer,Autumn,Winter}
Enumにメソッドを実装(拡張メソッド)
publicstaticclassSeasonsExt{publicstaticstringGetJapaneseName(thisSeasonsparam){switch(param){caseSeasons.Spring:return"春";caseSeasons.Summer:return"夏";caseSeasons.Autumn:return"秋";caseSeasons.Winter:return"冬";}}}// 使い方varseason=Seasons.Spring;varjapaneseName=season.GetJapaneseName();
定義されている値かどうかチェック
Console.WriteLine(Enum.IsDefined(typeof(Seasons),0));// TrueConsole.WriteLine(Enum.IsDefined(typeof(Seasons),4));// FalseConsole.WriteLine(Enum.IsDefined(typeof(Seasons),"Spring"));// TrueConsole.WriteLine(Enum.IsDefined(typeof(Seasons),"spring"));// False(大文字・小文字区別される)
型変換
int ⇔ Enum変換
// int -> EnumSystem.Console.WriteLine((Seasons)0);// SpringSystem.Console.WriteLine((Seasons)4);// 4(定義されていない値でも例外は発生しない)// Enum -> intSystem.Console.WriteLine((int)Seasons.Winter);// 3
string ⇔ Enum変換
// string -> Enumif(Enum.TryParse<Seasons>("Summer",outvarseason)){System.Console.WriteLine(season);// Summer}// 数値の文字列も変換できるif(Enum.TryParse<Seasons>("1",outvarseason)){System.Console.WriteLine(season);// Summer}// Enum -> stringSystem.Console.WriteLine(Seasons.Winter.ToString());// Winter
int/string -> Enumの変換用メソッド作ってみた
なんだか少しまどろっこしいかんじになってしまいました。
publicstaticT?ConvertToEnum<T>(objectvalue)whereT:struct{// TがEnumかどうかチェック// where T : Enum にすると、戻り値をNullableにできないので...if(!typeof(T).IsEnum)returnnull;stringstringValue;switch(value){caseintintVal:stringValue=intVal.ToString();break;casestringstringVal:stringValue=stringVal;break;default:// int, string以外は処理対象外とするreturnnull;}// TryParseする前に、定義されている値かチェックする// ※ 数値の場合、定義されていない値でもTryParseが成功してしまうためif(!Enum.IsDefined(typeof(T),value))returnnull;if(Enum.TryParse<T>(stringValue,outvarresult)){returnresult;}returnnull;}