Quando si utilizzano Enums con campi di bit:C'è un altro modo per testare i campi di bit Enum?
enum ReallyBigEnum { FirstChoice = 0x01, AnotherOption = 0x02 }
ReallyBigEnum flag = ReallyBigEnum.FirstChoice | ReallyBigEnum.AnotherOption;
il codice usato per testare i bit è:
if((flag & ReallyBigEnum.AnotherOption) == ReallyBigEnum.AnotherOption) { ... }
che sembra dettagliata e soggetto a errori a causa della necessità di ripetere il bit in fase di test.
Sarebbe bello se ci fosse un modo per dire:
if(flag.IsSet(ReallyBigEnum.AnotherOption)) { ... }
ma Enums non supportano metodi di istanza. Così, ho provato una funzione template:
class Enums
{
public static bool IsSet<T>(T flag, T bit) { return (flag & bit) == bit; }
}
ma il codice per testare i bit, allora si presenta così:
if(Enums.IsSet<ReallyBigEnum>(flag, ReallyBigEnum.AnotherOption)) { ... }
che è un sacco di scrivere. Poi ho cercato di accorciare:
class Enums
{
public static bool IsSet(int flag, int bit) { return (flag & bit) == bit; }
}
, ma poi si deve lanciare ogni valore al suo tipo di base in questo modo:
if(Enums.IsSet((int)flag, (int)ReallyBigEnum.AnotherOption)) { ... }
che è anche un dolore per il codice e perde il vantaggio di controllo di tipo .
È possibile scrivere la stessa funzione per utilizzare i parametri "oggetto", ma dopo il tipo di oggetto e il tipo di base sottostante devono essere testati.
Quindi, sono bloccato con il modo ridondante standard nella parte superiore.
Qualcuno ha altre idee su un modo semplice e pulito per testare i campi di bit Enum?
Grazie mille.
Il metodo hasFlag() è la soluzione perfetta, naturalmente. Grazie! Sfortunatamente, il nostro ambiente di sviluppo utilizza ancora .NET 2.0. –