列挙型の変換操作いろいろまとめ
列挙型 (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);
}
コメントを書く