2009-06-30 1 views
22

내가이를 위해 C#에서 열거하는 문자열에서 사이 명시 적 캐스트를하고 싶은 열거 형 :C#을 명시 적 캐스트 문자열은

(MyEnum) Enum.Parse(typeof(MyEnum),stringValue) 

내가 명시 적 캐스트 연산자로이 추방 싶습니다 나는 이것을했지만 작동하지 않았다.

.NET 3.5를 사용하는 것이 가능한지 알고 있는가?

답변

29

캐스트 할 수 없습니다. 문제는 사용자 정의 변환이 구조체 또는 클래스 선언에 포함되어야하며 변환은 둘러싸는 유형으로 또는에서 이루어져야한다는 것입니다. MyEnumstring도 이제까지 바깥 쪽 유형이 될 수 있기 때문에,

public static explicit operator MyEnum(string value) 

는 불가능하다.

ECMA334 C# 1 규격의 관련 섹션 17.9.4이다

A 변환 연산자 반환에 의해 표시되는 목표 입력하려면 변환 연산자의 파라미터 유형에 의해 지시 된 소스 유형으로부터 변환

유형은 변환 연산자입니다. 클래스 또는 구조체는 이 모두있는 경우에만 소스 유형 S에서 대상 유형 T 로의 변환을 선언하도록 허용 된 입니다. 여기서 S0 및 T0은 후행을 제거하여 생성되는 유형입니까? S와 T의 수정 자 (있는 경우) :

S0와 T0은 다른 유형입니다.

S0 또는 T0은 연산자 선언이 수행되는 클래스 또는 구조체 유형입니다 ().

S0 또는 T0이 인터페이스 유형이 아닙니다. 사용자 정의 변환을 제외

, 변환은 문자열 클래스의 확장 방법을 할 수있는, S에서 T 또는 T에서 그러나

S.

에 존재하지 않습니다.

public static class StringExtensions { 
    public static T ConvertToEnum<T>(this string value) { 
     Contract.Requires(typeof(T).IsEnum); 
     Contract.Requires(value != null); 
     Contract.Requires(Enum.IsDefined(typeof(T), value)); 
     return (T)Enum.Parse(typeof(T), value); 
    } 
} 
+0

큰 답변입니다! 나는 어딘가에서 그것을 보았고 이것을 어떻게 작동시키는 지 기억하지 못했다. 감사! –

+0

훌륭한 확장! 많은 사람들은 값이 열거 형에 정의되어 있는지 확인하는 것을 잊어 버립니다. – Gromer

+1

@ Gromer 나는 그 이유에 대해 언급할만한 가치가 있다고 생각한다 .Net 4.0은 바로 그 이유 인 Enum.TryParse()에 대한 메소드를 추가했다. – Dan

9

캐스트 연산자를 사용해야합니까? 또 다른 옵션은 문자열의 확장 메서드를 추가하는 것입니다.

public static class StringEnumConversion 
{ 
    public static T Convert<T>(this string str) 
    { 
     return (T)Enum.Parse(typeof(T), str); 
    } 
}