はじめに
毎回「あれ、どう書くんだっけ」と調べているので、まとめておこうと思います。
// 各サンプルコードで使用するEnum
public enum Seasons
{
Spring,
Summer,
Autumn,
Winter
}
全要素取得してループ
foreach (var season in (Seasons[])Enum.GetValues(typeof(Seasons)))
{
}
Enumにメソッドを実装(拡張メソッド)
public static class SeasonsExt
{
public static string GetJapaneseName(this Seasons param)
{
switch (param)
{
case Seasons.Spring:
return "春";
case Seasons.Summer:
return "夏";
case Seasons.Autumn:
return "秋";
case Seasons.Winter:
return "冬";
}
}
}
// 使い方
var season = Seasons.Spring;
var japaneseName = season.GetJapaneseName();
定義されている値かどうかチェック
Console.WriteLine(Enum.IsDefined(typeof(Seasons), 0)); // True
Console.WriteLine(Enum.IsDefined(typeof(Seasons), 4)); // False
Console.WriteLine(Enum.IsDefined(typeof(Seasons), "Spring")); // True
Console.WriteLine(Enum.IsDefined(typeof(Seasons), "spring")); // False(大文字・小文字区別される)
型変換
int ⇔ Enum変換
// int -> Enum
System.Console.WriteLine((Seasons)0); // Spring
System.Console.WriteLine((Seasons)4); // 4(定義されていない値でも例外は発生しない)
// Enum -> int
System.Console.WriteLine((int)Seasons.Winter); // 3
string ⇔ Enum変換
// string -> Enum
if (Enum.TryParse<Seasons>("Summer", out var season))
{
System.Console.WriteLine(season); // Summer
}
// 数値の文字列も変換できる
if (Enum.TryParse<Seasons>("1", out var season))
{
System.Console.WriteLine(season); // Summer
}
// Enum -> string
System.Console.WriteLine(Seasons.Winter.ToString()); // Winter
int/string -> Enumの変換用メソッド作ってみた
なんだか少しまどろっこしいかんじになってしまいました。
public static T? ConvertToEnum<T>(object value) where T : struct
{
// TがEnumかどうかチェック
// where T : Enum にすると、戻り値をNullableにできないので...
if (!typeof(T).IsEnum) return null;
string stringValue;
switch (value)
{
case int intVal:
stringValue = intVal.ToString();
break;
case string stringVal:
stringValue = stringVal;
break;
default:
// int, string以外は処理対象外とする
return null;
}
// TryParseする前に、定義されている値かチェックする
// ※ 数値の場合、定義されていない値でもTryParseが成功してしまうため
if (!Enum.IsDefined(typeof(T), value)) return null;
if (Enum.TryParse<T>(stringValue, out var result))
{
return result;
}
return null;
}