2012-11-16 2 views
0

이 질문의 코드를 사용하십시오. How do I check if more than one enum flag is set?이 테스트를 수행하는 일반 확장을 구현하려고했습니다.둘 이상의 플래그가 일반 확장으로 설정되어 있는지 확인하십시오.

첫 번째 시도는 다음과 같습니다. '-'

운영자 결과

public static bool ExactlyOneFlagSet(this Enum enumValue) 
{ 
    return !((enumValue & (enumValue - 1)) != 0); 
} 

은 'System.Enum'와 'INT'

OK 메이크업 감각 유형의 피연산자에 적용, 그래서 나는 생각 될 수 없다 나는 이런 것을 시도 할 것입니다.

public static bool ExactlyOneFlagSet<T>(this T enumValue) where T : struct, IConvertible 
{ 
    return !(((int)enumValue & ((int)enumValue - 1)) != 0); 
} 

그 결과

또한이 확장 방법이 구현 될 수있다 지구에이 문제에 대한 책을 읽은하지만 방법 후 의미가 'INT'

에 유형 'T'를 변환 할 수 없습니다. 도움이 될 정도로 친절한 누군가 ??? 당신이 IConvertible을 구현하는 T을 contrain 때문에

답변

2

, 당신은 단순히 ToInt32 호출 할 수

public static bool ExactlyOneFlagSet<T>(this T enumValue) 
    where T : struct, IConvertible 
{ 
    int v = enumValue.ToInt32(null); 
    return (v & (v - 1)) == 0; 
} 
+0

당신처럼 보이는 당신이 공급자에 문화를 필요로한다! int v = enumValue.ToInt32 (System.Threading.Thread.CurrentThread.CurrentCulture); 내가 잘못? 그렇지 않으면 지금 시험해 보면 아름다워. –

관련 문제