Como Jacob explica en un comentario de su método no es correcto en absoluto. Personalmente siempre evito programar matemáticamente, especialmente cuando se trata de lógica. Entonces, mi solución sería algo así como "si quisiera saber que el recuento es uno, cuenten y compárenlo con el número uno".
Aquí está:
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;
}
Y usted puede utilizarlo para su tipo foo como esto:
var toReturnFalse = (byte)(foo.Flag1 | foo.Flag2);
var toReturnTrue = (byte)foo.Flag1;
var trueWillBeReturned = OneIsSet(typeof(foo), toReturnTrue);
var falseWillBeReturned = OneIsSet(typeof(foo), toReturnFalse);
Creo que estos métodos pueden ser escritos de una manera más genérica utilizando los genéricos y el tipo métodos de manejo Sin embargo, incluí los métodos para los tipos de base más comunes para enumeraciones que son int y byte. Pero también puedes escribir lo mismo para abreviar y otros tipos. También puede insertar el código en su código. Es solo una linea de codigo
También utilizando este método, puede ver si el número de banderas establecidas es dos o más. El código siguiente devuelve verdadero si el recuento de banderas establecidas es igual a 'n'.
Enum.GetValues(enumType).Cast<byte>().Count(v => (value & v) == v) == n;
Parece bastante simple, sí. ¿Por qué no hacerlo de esa manera? – Groo
No coloque un prefijo en sus títulos con "C#:" y tal. Para eso son las etiquetas. –
¿Por qué tengo la sensación de que esta es una pregunta de "mira mi solución" disfrazada de pregunta ... –