Al utilizar Enums con campos de bits:¿Hay alguna otra forma de probar los campos de bits Enum?
enum ReallyBigEnum { FirstChoice = 0x01, AnotherOption = 0x02 }
ReallyBigEnum flag = ReallyBigEnum.FirstChoice | ReallyBigEnum.AnotherOption;
el código utilizado para probar los bits es:
if((flag & ReallyBigEnum.AnotherOption) == ReallyBigEnum.AnotherOption) { ... }
que parece verbosa y propenso a errores debido a la necesidad de repetir el bit siendo probado.
Sería agradable si había alguna manera de decir:
if(flag.IsSet(ReallyBigEnum.AnotherOption)) { ... }
pero enumeraciones no son compatibles con los métodos de instancia. Por lo tanto, he intentado una función de plantilla:
class Enums
{
public static bool IsSet<T>(T flag, T bit) { return (flag & bit) == bit; }
}
pero el código para probar los bits a continuación, tiene el siguiente aspecto:
if(Enums.IsSet<ReallyBigEnum>(flag, ReallyBigEnum.AnotherOption)) { ... }
lo cual es mucho para escribir. Luego trató de acortarlo:
class Enums
{
public static bool IsSet(int flag, int bit) { return (flag & bit) == bit; }
}
pero luego se va a emitir cada valor a su tipo base como esto:
if(Enums.IsSet((int)flag, (int)ReallyBigEnum.AnotherOption)) { ... }
que es también un dolor de código y pierde el beneficio de la comprobación de tipos .
Se podría escribir la misma función para usar los parámetros 'objeto', pero luego debería probarse el tipo de objeto y el tipo de base subyacente.
Por lo tanto, estoy atascado con la forma estándar y redundante en la parte superior.
¿Alguien tiene otras ideas sobre una manera limpia y simple de probar los campos de bits Enum?
Much Thanks.
El método HasFlag() es la solución perfecta, por supuesto. ¡Gracias! Desafortunadamente, nuestro entorno de desarrollo todavía usa .NET 2.0. –