C #에서 문자열을 열거 형 값으로 변환하는 가장 좋은 방법은 무엇입니까?
열거 형 값을 포함하는 HTML select 태그가 있습니다. 페이지가 게시되면 값 (문자열 형식)을 가져 와서 열거 형 값으로 변환하고 싶습니다.
이상적인 세상에서는 다음과 같이 할 수 있습니다.
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");
의견에서 제안 된 옵션 중 하나는 확장을 추가하는 것입니다.
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
들은 (열거를 보유 여부 그래서 1234.ToString().ToEnum(StatusEnum.None)
것 유효하지만 무의미합니다). 전체 개발 팀이 확장 기능에 대해 잘 이해하지 않는 한 매우 구체적인 상황에만 적용되는 추가 메서드를 사용하여 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
도 마찬가지입니다 .
성능에 민감한 코드에서 문자열을 열거 형으로 변환해야하는 경우 가장 좋은 방법은 시작시 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>();