2009-04-14 5 views
4
나는 반사를 통해 다음 (상당) 열거 작업을 수행하는 것은 불가능 결정

- 열거 형 클래스에는 연산자가 없기 때문에, 그리고 나 방출 된 코드가 어떤 사업자 노출 않습니다박스형 열거의 적분 값을 가져

object boxedEnum = MyEnum.Flag1 | MyEnum.Flag2; 
boxedEnum &= ~MyEnum.Flag2; // Remove the flag. 
을 그래서 현재 다음 (상당)하고있는 중이 야

:

: 잘 작동

int boxedEnumValue = (int) boxedEnum; 
boxedEnumValue &= ~MyEnum.Flag2; 
boxedEnum = Enum.ToObject(boxedEnum.GetType(), boxedEnumValue); 

는 유일한 문제는 정수로 boxedEnum을 설정하기 위해 해당 코드가 있다는 것입니다

당신이 동의 할 것이라고 확신하는 사람은 끔찍하고 해커입니다.

그래서이 질문에는 두 가지 갈래가 있습니다. 누군가가 나를 틀리게 증명할 수 있고 박스형 열거 형에서 이진 연산을 수행 할 수있는 방법을 제공한다면 정말 멋질 것입니다. 그렇지 않으면 문자열 왕복을 피할 수있는 방법이 인정 될 것입니다.

Guffa 내가 enum을 특정 유형으로 변환하기 위해 필요한 것을 알려주었습니다.

/// <summary> 
    /// Gets the integral value of an enum. 
    /// </summary> 
    /// <param name="value">The enum to get the integral value of.</param> 
    /// <returns></returns> 
    public static T ToIntegral<T>(this object value) 
    { 
     if(object.ReferenceEquals(value, null)) 
      throw new ArgumentNullException("value"); 
     Type rootType = value.GetType(); 
     if (!rootType.IsEnum) 
      throw new ArgumentOutOfRangeException("value", "value must be a boxed enum."); 
     Type t = Enum.GetUnderlyingType(rootType); 

     switch (t.Name.ToUpperInvariant()) 
     { 
      case "SBYTE": 
       return (T)Convert.ChangeType((sbyte) value, typeof(T)); 
      case "BYTE": 
       return (T) Convert.ChangeType((byte) value, typeof(T)); 
      case "INT16": 
       return (T) Convert.ChangeType((Int16) value, typeof(T)); 
      case "UINT16": 
       return (T) Convert.ChangeType((UInt16) value, typeof(T)); 
      case "INT32": 
       return (T) Convert.ChangeType((Int32) value, typeof(T)); 
      case "UINT32": 
       return (T) Convert.ChangeType((UInt32) value, typeof(T)); 
      case "INT64": 
       return (T) Convert.ChangeType((Int64) value, typeof(T)); 
      case "UINT64": 
       return (T) Convert.ChangeType((UInt64) value, typeof(T)); 
      default: 
       throw new NotSupportedException(); 
     } 
    } 

답변

6

박스 값은 절대로 변경 될 수 없습니다. 당신은, 열거를 언 박싱 작업을하고 다시 상자에 있습니다

boxedEnum = (MyEnum)boxedEnum & ~MyEnum.Flag2; 

편집 :

제공 열거의 기본 유형은 int이며, 당신은 단지 int로하고 상자에 그것을 언 박싱 수 있습니다 int로. boxed int는 나중에 enum 유형에 unbox 될 수 있습니다.

boxedEnum = (int)boxedEnum & ~2; 

MyEnum value = (MyEnum)boxedEnum; // works both for a boxed int and a boxed MyEnum 
+0

불행히도 나는 할 수 없다. 어떤 종류의 열거 형을 받아 들일 필요가있는 도우미 메서드입니다. –

+0

기본 형식이 enum 인 경우 int에 상자를 unbox하고 int에 boxing 할 수 있습니다. boxed int는 나중에 열거 형에서 unbox 될 수 있습니다. – Guffa

+0

@Guffa you 천재! 내가 받아 들일 수 있도록 답을 편집 할 수 있습니까? –

0
int enumValue = (int)SomeEnum.Val1 | (int)SomeEnum.Val2; 
SomeEnum e = (SomeEnum)enumValue; 

당신이 뭔가를 달성 하시겠습니까 : 나는 세세한 부분을 수행 확장 메서드를 작성?

+0

열거 형입니다. int로 형변환하기 전에 unbox해야합니다. –

관련 문제