LoginSignup
3
4

More than 1 year has passed since last update.

【C#】Enumでよく使うけど忘れがちなもののメモ

Last updated at Posted at 2020-12-18

はじめに

毎回「あれ、どう書くんだっけ」と調べているので、まとめておこうと思います。

// 各サンプルコードで使用する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;
}
3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4