2013-04-06 1 views
7

내가 문제가 C#에서 반사를 사용하여 문자열 값을 알 수없는 열거 형의 인스턴스를 생성 .Enum, my value는 수수께끼의 Enum에있는 항목과 일치하는 int 값입니다.런타임에 내가 열거의 System.Type이 있고 baseType 여기서 시스템임을 확인 한 때 열거의 인스턴스를 생성하는 방법을 정확히 운동

지금까지이 코드는 다음과 같이 상술 단지 로직이다.

 if (Type.GetType(type) != null) 
     { 
      if (Type.GetType(type).BaseType.ToString() == "System.Enum") 
      { 
       return ???; 
      } 
     } 

내가이 과거에 열거 형 작업 항상 메신저 혼란 내가 구문 분석하려고 열거 코드 시간에하지만이 시나리오에서 알고 있고 구글 친화적 인 방법으로 내 질문을 분명히 말하는 약간의 행운이 있었다 ... 나는 보통

(SomeEnumType)int 

같은 것을 할 것입니다하지만 난 코드시 EnumType을 잘 모릅니다 때문에 내가 어떻게 같은 일을 달성 할 수 있습니까?

+0

그것은 당신이 후 원하는 작업 "반환 ???"혼란 조금이고, 할 왜 당신이 경우에 반사가 필요합니다. 동일한 (SomeEnumType) 유형을 사용하여 유형을 SomeEnumType으로 유형 변환 할 수 있습니다. – outcoldman

+0

문제는 내가 어떤 열거 형이 될 수 있는지 모르겠 런타임에 될 수있는 .. 반환 ??? [/ 코드] –

+0

이 라인'Type.GetType (타입) .BaseType.ToString() == "System.Enum"; [코드] Enum.Parse (Type.GetType (타입), OB) 같은 것 '객체가'SomeEnumType'을 이미 'SomeEnumType' 타입으로 변환했기 때문에'SomeEnumType'을'SomeEnumType'으로 변환해야하는 이유는 무엇입니까? 이것으로 무엇을 달성하기를 원하십니까? – outcoldman

답변

10

Enum 클래스에 ToObject 방법을 사용하여 일반적인 함수로

if (Type.GetType(type) != null) 
{ 
    var enumType = Type.GetType(type); 
    if (enumType.IsEnum) 
    { 
     return Enum.ToObject(enumType, value); 
    } 
} 
+1

'enumType.BaseType == typeof (Enum)'대신에'enumType.IsEnum'을 쓰는 것이 더 쉽습니다. –

+0

왜 Enum.ToObject 메소드를 남겨 두었습니까? 나는 당신이 지금하는 것처럼'string' 인스턴스를 통과하는 것보다 훨씬 더 좋아했습니다. –

0

사용 (ENUMName)Enum.Parse(typeof(ENUMName), integerValue.ToString())

(구문 오류를 수정 편집 :

var enumValue = Enum.ToObject(type, value); 

또는 사용자가 제공 한 코드처럼

) ...

public static E GetEnumValue<E>(Type enumType, int value) 
         where E : struct 
    { 
     if (!(enumType.IsEnum)) throw new ArgumentException("Not an Enum"); 
     if (typeof(E) != enumType) 
      throw new ArgumentException(
       $"Type {enumType} is not an {typeof(E)}"); 
     return (E)Enum.Parse(enumType, value.ToString()); 
    } 

오래된 잘못된 버전 :

public E GetEnumValue(Type enumType, int value) where E: struct 
{ 
    if(!(enumType.IsEnum)) throw ArgumentException("Not an Enum"); 
    if (!(typeof(E) is enumType)) 
     throw ArgumentException(string.format(
      "Type {0} is not an {1}", enumType, typeof(E)); 
    return Enum.Parse(enumType, value.ToString()); 
} 
+1

이것은 몇 가지 방법으로 잘못되었습니다. (1) 메소드에는'where' 제약 조건이 있지만'E' 유형을 "정의"하고 메소드를 generic으로 만드는 것을 잊어 버립니다. (2) 메서드를 호출 할 때'E'를 어떻게 제공해야합니까? 그것은 컴파일러에 의해 추론되지 않을 것입니다. (3)'is' 표현식이 문법적으로 잘못되었습니다. 'is'의 오른쪽은 타입이 아니라 객체입니다. 어쩌면 당신은'is' 대신에'! ='를 사용하려고 했었 을까요? 목적은 무엇입니까? (4) 리턴 타입은 당신이 일반이 아닌'Enum.Parse' 메쏘드의 출력을 형 변환 할 것을 요구합니다. –

+0

죄송합니다. 컴파일하지 않고 입력하십시오. 구문 오류를 수정했습니다. –

관련 문제