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>();