列挙型の変換操作いろいろまとめ

列挙型 (enum) から 文字列 (string) または 数値 (int) に変換する方法をまとめました。

次のような Colors という列挙型を定義しておき、これを使って各処理を見ていきます。

public enum Colors
{
    Black = 0,
    Red   = 1,
    Green = 2,
    Blue  = 3,
    White = 4,
}

列挙型 (enum) と 文字列 (string) 相互変換

列挙型 (enum) => 文字列 (string)

列挙型 (enum) を 文字列 (string) に変換する方法は ToString() で行います。

var color = Colors.Red;
var strColor = color.ToString();  // "Red"

文字列 (string) => 列挙型 (enum)

列挙型の値の文字列を列挙型に変換するには Enum.Parse を使います。Enum.Parse は 列挙型 (enum) の Typeと変換する文字列を渡すことで変換された Object を返します。その Object を 列挙型 (enum) にキャストをしてやればよいです。

基本的には大文字と小文字を別物として区別しますが、Enum.Parseメソッドの第3引数(ignoreCase) で true を指定することで、区別しないで変換することができます。以下の例ではいずれも変換できます。

// 大文字と小文字は区別します。
// "RED"などでは変換できません。
var strRed = "Red";
var colorRed = (Colors)Enum.Parse(typeof(Colors), strRed);

// 大文字と小文字を区別しません。
var strBlue = "BLUE";
var colorBlue = (Colors)Enum.Parse(typeof(Colors), strBlue, true);

列挙型 (enum) と 数値型 (int) 相互変換

列挙型 (enum) => 数値型 (int)

列挙型 (enum) を 数値型 (int) に変換する方法は単純にキャストすればよいです。

var color = Colors.Red;
var intColor = (int)color;  // 1

数値型 (int) => 列挙型 (enum)

数値型 (int) の値を列挙型に変換するには Enum.ToObject を使います。Enum.ToObject は列挙型 (enum) の Typeと変換する値を渡すことで変換された Object を返します。その Object を 列挙型 (enum) にキャストをしてやればよいです。

var intColor = 1;
var colorRed = (Colors)Enum.ToObject(typeof(Colors), intColor);

Enumの判定方法

Object が 列挙型 (enum) かどうか判定するメソッド

public static bool IsEnum(object obj)
{
    var type = obj.GetType();
    return type.IsEnum;
}

値(intやstring) が 列挙型 (enum) に含まれる値かどうか

値が列挙型 (enum) に含まれる値かどうかを判定するには、Type.IsEnumDefined を使えばよいです。

var type = typeof(Colors);

string red = "Red";
string yellow = "Yellow";

// true, false, true, false
Console.WriteLine(type.IsEnumDefined(red));
Console.WriteLine(type.IsEnumDefined(yellow));
Console.WriteLine(type.IsEnumDefined(1));
Console.WriteLine(type.IsEnumDefined(-1));

列挙型 (enum) を ジェネリックで使う

列挙型 (enum) を ジェネリックで型制約を付けて使用することはできません。無理にやるとすると、struct の型制約を使い、上記のType.IsEnumを使用し、列挙型 (enum) の場合のみ処理をする方法があります。

一例として、ジェネリックを利用して、値(int, string) を 列挙型 (enum) に変換するメソッドを定義してみます。

// 文字列(string) → 列挙型(enum)
public static TEnum GetEnum<TEnum>(string value) where TEnum : struct
{
    var type = typeof(TEnum);
    if (string.IsNullOrEmpty(value))
        // 値がNullの場合
        throw new ArgumentException("Value is null.");
    else if (!type.IsEnum)
        // Enum以外の型が指定された場合
        throw new NotSupportedException($"\"{type.Name}\" is not enum.");
    else if (!type.IsEnumDefined(value))
        // Enumの値に存在しない文字列の場合
        throw new ArgumentException("Value Name Not Found.");

    return (TEnum)Enum.Parse(type, value);
}
// 数値(int) => 列挙型(enum)
public static TEnum GetEnum<TEnum>(int value) where TEnum : struct
{
    var type = typeof(TEnum);
    if (!type.IsEnum)
        // Enum以外の型が指定された場合
        throw new NotSupportedException($"\"{type.Name}\" is not enum.");
    else if (!type.IsEnumDefined(value))
        // Enumの値に存在しない文字列の場合
        throw new ArgumentException("Value Name Not Found.");

    return (TEnum)Enum.ToObject(type, value);
}