zukucode
主にWEB関連の情報を技術メモとして発信しています。

C# enumで決められた状態を表す

注文状態を文字列で持つと、"shippd"のようなタイプミスもコンパイルできます。候補が固定されている値はenumで表せます。

状態を定義する

public enum OrderStatus
{
    Waiting = 1,
    Shipped = 2,
    Canceled = 3,
}

OrderStatus status = OrderStatus.Waiting;

if (status == OrderStatus.Waiting)
    Console.WriteLine("発送を待っています。");

数値を明示すると、途中へ値を追加しても既存値がずれません。DBや外部APIへ数値として保存する場合、番号は契約になるため、公開後に別の意味へ変更しません。

文字列から変換する

string input = "shipped";

if (Enum.TryParse<OrderStatus>(input, ignoreCase: true, out var status))
    Console.WriteLine(status); // Shipped
else
    Console.WriteLine("不明な注文状態です。");

利用者の入力やCSVの値は変換に失敗する可能性があるため、ParseよりTryParseが扱いやすい場合があります。

数値入力をそのまま信用しない

bool parsed = Enum.TryParse<OrderStatus>("999", out var status);
Console.WriteLine(parsed); // True
Console.WriteLine(Enum.IsDefined(status)); // False

TryParseは未定義の数値でも成功することがあります。外部入力ではEnum.IsDefinedも確認します。

if (!Enum.TryParse<OrderStatus>(input, true, out var status) ||
    !Enum.IsDefined(status))
{
    Console.WriteLine("定義されていない状態です。");
}

APIで名前を送る場合

ASP.NET CoreでJSONを"shipped"のような名前として扱う場合は、JSONのenum変換設定を明示します。数値と文字列のどちらを契約にするか決め、クライアントと統一します。

外部サービスのenumへ新しい値が追加される可能性がある場合、未知の値で失敗する設計が適切か確認します。


関連記事