2012-08-28 2 views
2

개체의 멤버 변수 인 열거 형을 사용하고 있습니다. 열거 형의 정확한 형식을 알지 못합니다. 단지 System.Enum에서 파생되었습니다. 열거 형의 기본 숫자 값을 설정하려고합니다. 즉 :System.Enum의 기본 값을 설정하십시오.

Enum e; 
// ... 
e = 42; // Doesn't comple 

이게 가능합니까? 리플렉션으로 처리 할 수 ​​있습니까?

편집 1 : 열거 형은 더 큰 데이터 구조의 일부이므로 Enum.ToObject()를 사용하여 새 값을 만드는 것은 적합하지 않습니다.

편집 2 : 열거 형 개체의 멤버 변수임을 명확히했습니다.

편집자 3 : 몇 명의 주석 작성자가 더 많은 컨텍스트를 요구 했으므로 UI ​​컨트롤 (텍스트 상자 등)을 객체 데이터 모델의 해당 필드와 연관시키는 범용 코드가 있습니다. UI가 변경되면 모델이 업데이트되고 그 반대의 경우도 마찬가지입니다. 나는 이것을 확장하여 콤보 상자와 열거 형 사이에 매핑하고자했습니다. 여기서 열거 형은 선택된 콤보 엔트리의 인덱스로 설정 될 것이다. 열거 형의 기본 값에서 선택한 항목을 설정하는 것은 쉬운 일이 아니지만이 문제의 반대로 문제가 발생합니다. 나는 이것이 가능하지 않을 것이라고 확신했지만 물어볼 가치가 있다고 생각했다. bacause Enum 복싱 된 값이고, 당신은에 액세스 할 수 있어야 뭔가를 상자하기 위해 -

+1

이렇게해도 사용자 기능에 전달 된 Enum 값은 변경되지 않습니다. 너 뭐하려고? – Random832

+1

btw, "열거에 대한 참조"라는 의미를 분명히하는 데 도움이 될 수 있습니다. 값을 직접 참조하려면 타입을 알아야합니다 (일반적인 메소드에서 'T'일지라도). 그렇지 않으면 아마도 원래 값 자체가 아닌 * boxed copy *에 대한 참조를 사용하고있을 것입니다. –

+0

이것은 우주와 모든 것의 생명에 대한 해답입니다! 열거 형을 사용하려면 디자인을 알고 있어야합니다. 낭비되는 시간을위한 Downvote. – MrFox

답변

1

당신은 당신이 컴파일 시간에 그것을 모르더라도, 열거의 Type런타임에 알 필요가 형식 (따라서 .GetType()이 올바른 것을 반환합니다); 이 개체 자체의 값을 변경할 실제로 불가능

public Enum GetEnumValue(Type type) { 
    return (Enum)Enum.ToObject(type, 42); 
} 
+0

도움이 답변 마크 주셔서 감사합니다. 이 문제는 기존의 코드를 확장하는 것을 고려한 결과 발생했으며 (문제의 편집 3 참조) 사용자는이를 수행 할 수 없다는 것을 확인했습니다. –

+2

@AndyJohnson note : 실제로'SomeFunc (ref T 값)'을 가지고 있다면, 아마 * 할 수는 있지만 아마도'ILGenerator'가 필요합니다. –

2

하는 것으로,하지만 당신은 동일한 유형의 새 개체를 얻을 수 있습니다 : 예를 들어, 런타임에이 일을. 당신이하려는 일에 따라, 이것은 당신을 위해 작동하지 않을 수도 있습니다. 너 뭐하려고?

void SetTo42<T>(out T e) { 
    e = (T)Enum.ToObject(typeof(T), e); 
} 

이 비록 수행 할 수있는 매우 이상한 것은, 그래서 물어 봐야 :

e = Enum.ToObject(e.GetType(),42) 

좋아, 당신이 여기에서 할 수있는 최선은, 내가 생각이다 어쩌면 당신이 당신의 디자인을 재고해야 할지도 모르겠다.


좋아, 내가 사지에 나가서 당신이 뭘 하려는지 짐작하기 위하여려고하고있다 - 나는 당신의 "열거 전자"을 가정하고 GetValue를 사용에서 오는, 당신은 따라서의 fieldInfo (또는 PropertyInfo을 가지고)

void SetFieldTo42(Object obj, FieldInfo f) { 
    f.SetValue(obj,Enum.ToObject(f.FieldType, 42)); 
} 
+0

고마워요! 안타깝게도 Enum.ToObject()를 사용하면 설정하려고하는 열거 형이 더 큰 데이터 구조의 일부이기 때문에 수행하려는 작업에 적합하지 않습니다. 나는이 점을 지적하기 위해 질문을 편집했다. –

+0

'SetValue'를 할 때'Enum.ToObject'가 필요합니까? – Gabe

+0

@Gabe Dunno. 그것을 시도하십시오 - 당신이 잘못된 유형 (System.Int32)으로 값을 설정하려고하기 때문에 그것 없이는 실패 할 것으로 의심됩니다. – Random832

관련 문제