Sto cercando di creare un metodo di supporto per elencare i nomi di tutti i bit impostati in un valore Enum (per scopi di registrazione). Voglio avere un metodo che restituisca l'elenco di tutti i valori Enum impostati in alcune variabili. Nel mio esempioElenco di tutti i nomi bit di una bandiera Enum
[Flag]
Enum HWResponse
{
None = 0x0,
Ready = 0x1,
Working = 0x2,
Error = 0x80,
}
ho alimentarlo 0x81, e dovrebbe fornire me con un IEnumerable<HWResponse>
contenente {Ready, Error}
.
Come non ho trovato un modo più semplice, ho provato a scrivere il codice qui sotto, ma non riesco a farlo compilare.
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;
}
Su questa versione del codice, il compilatore si lamenta di non poter trasmettere T a Enum.
Cosa ho fatto di sbagliato? C'è un modo migliore (più semplice) per fare questo? Come potrei fare il cast?
Inoltre, ho provato a scrivere il metodo come
public static IEnumerable<T> MaskToList<T>(Enum mask) where T:Enum
ma Enum è di un tipo speciale che vieta il 'dove' la sintassi (con C# 4.0)
Questo non sembra dovrebbe essere un enum bandiera; le combinazioni non hanno senso. Qualcosa può essere "funzionante" e "pronto" allo stesso tempo? –
@DBM: questo è vero, è solo un esempio stupido – PPC
@All: Grazie per le tue grandi risposte. Tutti e 3 sono utili! – PPC