2009-11-02 12 views
6

Se ho uno enum contrassegnato con [Flags], esiste un modo in .NET per testare un valore di questo tipo per vedere se contiene solo un singolo valore? Posso ottenere il risultato che voglio usando il conteggio dei bit, ma preferirei utilizzare le funzioni integrate, se possibile.Test di un valore enum [Flag] per un singolo valore

Durante il looping dei valori enum dinamicamente, Enum.GetValues() restituisce anche i flag di combinazione. La chiamata a tale funzione nel numero enum nell'esempio seguente restituisce 4 valori. Tuttavia, non desidero il valore combinazioni incluse nell'algoritmo interno. Il test dei singoli valori enum per l'uguaglianza non è disponibile, poiché enum potrebbe potenzialmente contenere molti valori e richiede inoltre una manutenzione aggiuntiva quando i valori nella modifica enum cambiano.

[Flags] 
enum MyEnum 
{ 
    One = 1, 
    Two = 2, 
    Four = 4, 
    Seven = One | Two | Four, 
} 

void MyFunction() 
{ 
    foreach (MyEnum enumValue in Enum.GetValues(typeof(MyEnum))) 
    { 
     if (!_HasSingleValue(enumValue)) continue; 

     // Guaranteed that enumValue is either One, Two, or Four 
    } 
} 

private bool _HasSingleValue(MyEnum value) 
{ 
    // ??? 
}



correlati: StackOverflow: Enum.IsDefined on combined flags

risposta

14

È possibile gettarlo ai int e utilizzare le tecniche da Bit Twiddling Hacks per verificare se si tratta di una potenza di due.

int v = (int)enumValue; 
return v != 0 && (v & (v - 1)) == 0; 
+0

+1. Mentre sicuramente non è la tecnica più trasparente, è senza dubbio la più semplice. –

0

È possibile utilizzare una combinazione di IsDefined e controllo per potenze di 2.

+0

Nell'esempio che ho scritto, 'IsDefined' valuterà sempre a' true'. –

-1

Si potrebbe voi Enum.GetValues ​​e contare solo gli elementi che sono una potenza di 2 (divisibile per 2 senza resto).

Problemi correlati