C#で文字列を列挙型に変換する

c# string enums


C#で文字列を列挙値に変換する方法は?

列挙の値を含むHTMLのセレクトタグがあります。ページが投稿されたときに、その値(文字列の形になります)をピックアップして、列挙の値に変換したいと思います。

理想的な世界なら、こんなこともできそうです。

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

しかし、それは有効なコードではありません。




Answer 1 Keith


.NET Coreおよび.NET> 4 には、汎用の解析メソッドがあります。

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

これにはC#7の新しいインライン out 変数も含まれるため、これはtry-parse、明示的な列挙型への変換、 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>();

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

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 追加するときは注意してください(名前空間の制御なしで)enumを保持しているかどうかに関係なく( 1234.ToString().ToEnum(StatusEnum.None)string すべてのインスタンスに表示されます)有効ですが無意味です)。多くの場合、開発チーム全体がこれらの拡張機能の機能を十分に理解していない限り、非常に特定のコンテキストにのみ適用される追加のメソッドでMicrosoftのコアクラスが乱雑にならないようにするのが最善です。




Answer 2 Erwin Mayer


使用 Enum.TryParse<T>(String, T) (≥.NET 4.0):

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

C#7.0のパラメータータイプのインライン化により、さらに簡素化できます。

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



Answer 3 McKenzieG1


Enum.Parse() のパフォーマンスはリフレクションを介して実装されるため、ひどいことに注意してください。(同じことが Enum.ToString にも当てはまります。逆の場合です。)

パフォーマンスに敏感なコードで文字列をEnumに変換する必要がある場合は、起動時に Dictionary<String,YourEnum> を作成し、それを使用して変換を行うのが最善の方法です。




Answer 4 DavidWhitney


Enum.Parseを探しています。

SomeEnum enum = (SomeEnum)Enum.Parse(typeof(SomeEnum), "EnumValue");



Answer 5 Foyzul Karim


ここで拡張メソッドを使用できます。

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

そして、あなたは以下のコードでそれらを呼び出すことができます(ここで、 FilterType は列挙型です):

FilterType filterType = type.ToEnum<FilterType>();