Come Jacob ha spiegato in un commento il metodo non è corretto a tutti. Personalmente evito sempre di programmare matematicamente, specialmente quando si tratta di logica. Quindi la mia soluzione sarebbe qualcosa come "se volessi sapere che il conteggio è uno, quindi contalo e confrontalo con il numero uno".
Eccolo:
public static bool OneIsSet(Type enumType, byte value)
{
return Enum.GetValues(enumType).Cast<byte>().Count(v => (value & v) == v) == 1;
}
public static bool OneIsSet(Type enumType, int value)
{
return Enum.GetValues(enumType).Cast<byte>().Count(v => (value & v) == v) == 1;
}
E lo si può utilizzare per il vostro tipo foo in questo modo:
var toReturnFalse = (byte)(foo.Flag1 | foo.Flag2);
var toReturnTrue = (byte)foo.Flag1;
var trueWillBeReturned = OneIsSet(typeof(foo), toReturnTrue);
var falseWillBeReturned = OneIsSet(typeof(foo), toReturnFalse);
Credo che questo metodi potrebbero essere scritti in modo più generico utilizzando Generics e tipo metodi di manipolazione. Tuttavia ho incluso i metodi per i tipi di base più comuni per enumerazioni int e byte. Ma potresti anche scrivere lo stesso per brevi e altri tipi. Inoltre puoi semplicemente inserire il codice nel tuo codice. È solo una riga di codice.
Anche utilizzando questo metodo è possibile vedere se il numero di flag di serie è due o più. Il codice qui sotto restituisce true se il conteggio dei flag set è uguale a 'n'.
Enum.GetValues(enumType).Cast<byte>().Count(v => (value & v) == v) == n;
Questo sembra piuttosto semplice, sì. Perché non farlo in quel modo? – Groo
Si prega di non aggiungere il prefisso ai titoli con "C#:" e così via. Ecco a cosa servono i tag. –
Perché ho la sensazione che questa sia una domanda "guarda la mia soluzione" mascherata da una domanda ... –