Le operazioni di enum di flag integrate di .NET sono purtroppo piuttosto limitate. La maggior parte delle volte gli utenti non riescono a capire la logica dell'operazione bit a bit.
In .NET 4 è HasFlag
stato aggiunto il metodo Enum
che aiuta a semplificare il codice dell'utente, ma sfortunatamente ci sono molti problemi con esso.
HasFlag
non è sicuro per i tipi in quanto accetta qualsiasi tipo di argomento del valore enum, non solo il tipo enum specificato.
HasFlag
è ambiguo se verifica se il valore ha tutti o alcuni dei flag forniti dall'argomento valore enum. A proposito.
HasFlag
è piuttosto lento in quanto richiede il pugilato che causa allocazioni e quindi più raccolte di rifiuti.
A causa in parte del limitato supporto di .NET per gli enumeratori di flag, ho scritto la libreria OSS Enums.NET che affronta ciascuno di questi problemi e semplifica la gestione degli enumer di flag.
Di seguito sono riportate alcune delle operazioni fornite insieme alle loro implementazioni equivalenti utilizzando solo il framework .NET.
Combina bandiere
.NETTO flags | otherFlags
Enums.NET flags.CombineFlags(otherFlags)
Rimuovi bandiere
.NETTO flags & ~otherFlags
Enums.NET flags.RemoveFlags(otherFlags)
Bandiere comuni
.NETTO flags & otherFlags
Enums.NET flags.CommonFlags(otherFlags)
Attiva / disattiva bandiere
.NETTO flags ^ otherFlags
Enums.NET flags.ToggleFlags(otherFlags)
Ha tutte le bandiere
.NET (flags & otherFlags) == otherFlags
oflags.HasFlag(otherFlags)
Enums.NET flags.HasAllFlags(otherFlags)
Ha qualche bandiera
.NETTO (flags & otherFlags) != 0
Enums.NET flags.HasAnyFlags(otherFlags)
Ottieni bandiere
.NETTO
Enumerable.Range(0, 64)
.Where(bit => ((flags.GetTypeCode() == TypeCode.UInt64 ? (long)(ulong)flags : Convert.ToInt64(flags)) & (1L << bit)) != 0)
.Select(bit => Enum.ToObject(flags.GetType(), 1L << bit))`
Enums.NET flags.GetFlags()
Sto cercando di ottenere questi miglioramenti incorporati in .NET Core e forse alla fine il .NET Framework completo. Puoi dare un'occhiata alla mia proposta qui .