列挙型と文字列の変換
アプリケーション開発において、ログ出力やUIへの表示のために「列挙型の値を文字列に変換したい」場合や、逆に設定ファイルやAPIから受け取った文字列を「列挙型に変換して処理したい」という場面は頻繁に発生します。
C#では、これらの変換を簡単に行うためのメソッドが標準で用意されています。
この記事では、enumからstringへの変換、およびstringからenumへの変換について、安全かつ一般的な実装方法を解説します。
1. 列挙型から文字列への変換 (enum -> string)
列挙型のメンバー名(例: Active)を文字列として取得するには、主に2つの方法があります。
ToString() メソッド
最も簡単で一般的な方法は、変数に対して .ToString() を呼び出すことです。
string statusText = MyEnum.Value.ToString();
Enum.GetName() メソッド
Enum.GetName() 静的メソッドを使用すると、指定した値に対応する名前を取得できます。 ToString()との違いは、定義されていない数値が渡された場合の挙動です。
ToString(): 数値を文字列化して返します(例:"99")。Enum.GetName():nullを返します。存在確認を厳密に行いたい場合に適しています。
コード例:ステータスの文字列化
サーバーの状態を表す ServerState 列挙型を文字列に変換する例です。
using System;
public class EnumToStringExample
{
public static void Main()
{
ServerState currentState = ServerState.Running;
// 1. ToString() を使用 (一般的)
string stateString = currentState.ToString();
Console.WriteLine($"ToString: {stateString}");
// 2. Enum.GetName() を使用
// 引数: (typeof(型), 値)
string? name = Enum.GetName(typeof(ServerState), currentState);
Console.WriteLine($"GetName : {name}");
// (参考) 定義されていない値の場合
ServerState unknownState = (ServerState)99;
Console.WriteLine($"Undefined ToString: {unknownState}"); // "99"
Console.WriteLine($"Undefined GetName : {Enum.GetName(typeof(ServerState), unknownState) ?? "null"}"); // null
}
}
public enum ServerState
{
Stopped = 0,
Starting = 1,
Running = 2,
Stopping = 3
}
出力結果:
ToString: Running
GetName : Running
Undefined ToString: 99
Undefined GetName : null
2. 文字列から列挙型への変換 (string -> enum)
外部から入力された文字列(例: "Running")を列挙型に変換するには、Enum.Parse または Enum.TryParse を使用します。
Enum.Parse (例外の可能性あり)
Enum.Parse は変換を試みますが、文字列が列挙型に存在しない場合、ArgumentException をスローしてプログラムが停止するリスクがあります。入力値が確実に正しいと保証されている場合以外は推奨されません。
Enum.TryParse (推奨:安全な変換)
Enum.TryParse は変換の成否を bool で返します。例外が発生しないため、ユーザー入力などの不確実なデータを扱う際に適しています。
構文: Enum.TryParse<TEnum>(string input, [bool ignoreCase], out TEnum result)
ignoreCase:trueを指定すると、大文字・小文字を区別せずに変換します(例:"running"もRunningとして認識)。
コード例:設定値の読み込み
設定ファイルから読み込んだ文字列を、列挙型に安全に変換する例です。
using System;
public class StringToEnumExample
{
public static void Main()
{
string inputConfig = "running"; // 小文字で入力されたと仮定
// 1. TryParse で変換を試みる
// 第2引数 true: 大文字・小文字を無視する (IgnoreCase)
if (Enum.TryParse<ServerState>(inputConfig, true, out var resultState))
{
// 変換成功
Console.WriteLine($"変換成功: {resultState} (値: {(int)resultState})");
if (resultState == ServerState.Running)
{
Console.WriteLine("システムは稼働中です。");
}
}
else
{
// 変換失敗
Console.WriteLine($"変換失敗: '{inputConfig}' は有効なステータスではありません。");
}
// 2. 無効な文字列の場合
string invalidInput = "ErrorState";
if (!Enum.TryParse<ServerState>(invalidInput, out _))
{
Console.WriteLine($"変換失敗: '{invalidInput}' は存在しません。");
}
}
}
出力結果:
変換成功: Running (値: 2)
システムは稼働中です。
変換失敗: 'ErrorState' は存在しません。
まとめ
列挙型と文字列の相互変換は、C#開発において頻出するパターンです。
enum->string: 基本的にはToString()を使用します。値が存在するか厳密にチェックしたい場合はEnum.GetName()を使用します。string->enum: 例外を防ぐため、Enum.TryParse<T>()を使用することが推奨されます。ignoreCase: trueオプションを活用することで、大文字・小文字の揺らぎにも柔軟に対応できます。
