1. ホーム
  2. c#

[解決済み】C#で文字列をenumに変換する

2022-03-23 16:24:22

質問

C#で文字列を列挙型の値に変換する最も良い方法は何ですか?

列挙の値を含むHTMLの選択タグがあります。ページが投稿されるとき、私は値(文字列の形式である)をピックアップし、対応する列挙型の値に変換したいのです。

理想を言えば、次のようなことができる。

StatusEnum MyStatus = StatusEnum.Parse("Active");

が、これは有効なコードではありません。

解決方法は?

.NET Coreと.NET Framework ≥4.0では 一般的なパースメソッドである :

Enum.TryParse("Active", out StatusEnum myStatus);

また、C#7の新しいインラインの out 変数で、トライパース、明示的な列挙型への変換、および初期化+入力が行われます。 myStatus という変数があります。

C#7と最新の.NETにアクセスできるのであれば、これがベストな方法です。

オリジナル回答

.NETではむしろ醜いです(4以上まで)。

StatusEnum MyStatus = (StatusEnum) Enum.Parse(typeof(StatusEnum), "Active", true);

と簡略化することが多いですね。

public static T ParseEnum<T>(string value)
{
    return (T) Enum.Parse(typeof(T), value, true);
}

それなら、できる。

StatusEnum MyStatus = EnumUtil.ParseEnum<StatusEnum>("Active");

コメントで提案されたオプションの1つは、拡張機能を追加することで、これは簡単なことです。

public static T ToEnum<T>(this string value)
{
    return (T) Enum.Parse(typeof(T), value, true);
}

StatusEnum MyStatus = "Active".ToEnum<StatusEnum>();

最後に、文字列が解析できない場合に使用するデフォルトの列挙型を用意しておくとよいでしょう。

public static T ToEnum<T>(this string value, T defaultValue) 
{
    if (string.IsNullOrEmpty(value))
    {
        return defaultValue;
    }

    T result;
    return Enum.TryParse<T>(value, true, out result) ? result : defaultValue;
}

ということは、これが呼び出しになる。

StatusEnum MyStatus = "Active".ToEnum(StatusEnum.None);

しかし、このような拡張メソッドを string のすべてのインスタンスに表示されます。 string がenumを保持しているかどうかにかかわらず(だから 1234.ToString().ToEnum(StatusEnum.None) は有効ですが、無意味です)。開発チーム全体がその拡張機能が何をするものかをよく理解していない限り、マイクロソフトのコアクラスに非常に特殊な文脈でのみ適用される余分なメソッドを乱立させることは、しばしば避けるのが最善でしょう。