Estoy tratando de hacer un método auxiliar para listar los nombres de todos los bits establecidos en un valor Enum (para propósitos de registro). Quiero tener un método que devuelva la lista de todos los valores Enum establecidos en algunas variables. En mi ejemploListar todos los nombres de bit de una marca Enum
[Flag]
Enum HWResponse
{
None = 0x0,
Ready = 0x1,
Working = 0x2,
Error = 0x80,
}
que alimentarlo 0x81, y me debe proveer de un IEnumerable<HWResponse>
contiene {Ready, Error}
.
Como no encontré una manera más simple, traté de escribir el siguiente código, pero no puedo hacerlo compilar.
public static IEnumerable<T> MaskToList<T>(Enum mask)
{
if (typeof(T).IsSubclassOf(typeof(Enum)) == false)
throw new ArgumentException();
List<T> toreturn = new List<T>(100);
foreach(T curValueBit in Enum.GetValues(typeof (T)).Cast<T>())
{
Enum bit = ((Enum) curValueBit); // Here is the error
if (mask.HasFlag(bit))
toreturn.Add(curValueBit);
}
return toreturn;
}
En esta versión del código, el compilador se queja de que no puede convertir T en Enum.
¿Qué hice mal? ¿Hay una forma mejor (más simple) de hacer esto? ¿Cómo podría hacer el reparto?
Además, he intentado escribir el método como
public static IEnumerable<T> MaskToList<T>(Enum mask) where T:Enum
pero Enum es de un tipo especial que prohíbe la sintaxis 'dónde' (Uso de C# 4.0)
Esto no parece que deba ser una enumeración de la bandera; las combinaciones no tienen sentido. ¿Puede algo estar "trabajando" Y "listo" al mismo tiempo? –
@DBM: Esto es cierto, es solo un ejemplo tonto – PPC
@Todo: Gracias por sus excelentes respuestas. ¡Los 3 son útiles! – PPC