2011-12-27 4 views
0

내 프로그램에서 열거 형을 사용하여 개체의 현재 상태를 나타냅니다. 이 열거 형 값을 하나씩 차례로 순환 할 수 있기를 바랍니다. enum 값이 숫자 순차적이며 0으로 시작한다는 사실은 주어진 것입니다.여러 어셈블리의 동적 형식 캐스팅 동작

열거 형을 증가시키는 함수를 쓰려고 시도하는 중에 끝에 도달하면 반복하면 문제가 발생합니다. IncrWrap 방법은 그것을 호출하는 객체와 동일한 어셈블리 (프로젝트)에 존재하는 경우

public static TEnum IncrWrap<TEnum>(TEnum value) 
{ 
    int len = Enum.GetNames(typeof(TEnum)).Length; 
    dynamic wrapper = value; 
    dynamic newValue = ((int)wrapper + 1) % len; 
    return (TEnum)newValue; 
} 

, 그것은 완벽하게 작동합니다. 그러나 다른 프로젝트 (더 많은 것들이 그것을 사용할 수 있도록 더 높은 위로 이동하고 DLL에서 호출 할 경우 wrapperint에 캐스팅 할 때 RuntimeBinderException "Can not convert type ' System.Enum '을'int '로 변경하십시오.

Whats up? 왜 다른 어셈블리에서 함수를 호출하면 함수가 다르게 동작하게되는지 보지 못합니다. dynamic에 대해 뭔가 이해할 수 있습니까? 이것을하기 위해 반사를 사용하지 않아도 좋을 것입니다.

답변

1

불행히도 열거 형은 여기에 몇 가지 문제가 있습니다. 무엇보다도 열거 형은 char이 아닌 정수 타입을 가질 수 있습니다. 두 번째로, 열거 형이 기본 유형의 값을 점차 증가시키는 것은 아닙니다. 마지막으로 C# 언어는 다소 도움이 될 System.Enum의 제네릭 형식 제약 조건을 지원하지 않습니다. 말했다 모두와 함께, 당신이 약간 다르게 문제를 해결할 수 있다고 생각합니다 :

public static TEnum NextEnum<TEnum>(TEnum value) 
{ 
    if (!typeof(TEnum).IsEnum) 
     throw new ArgumentException("Expected type of System.Enum", "value"); 

    var values = Enum.GetValues(typeof (TEnum)); 
    var index = Array.IndexOf(values, value); 
    return (TEnum)Enum.ToObject(typeof (TEnum), values.GetValue((index + 1) % values.Length)); 
} 

나는 당신이 그 동적 솔루션을 사용하여 작동시킬 수 있다고 실제로 놀랐어요.

+0

또 다른 문제가 있습니다. Array.IndexOf는 'value'값이 열거 형의 정의 된 값 중 하나가 아닌 경우 -1을 반환합니다. – phoog

+0

좋아요! 감사. 여전히 두 가지 상황에서 내 메서드가 다르게 동작하는 이유는 여전히 궁금하지만이 솔루션이 확실히 좋습니다. – Lucina