Les opérations d'énumération des drapeaux intégrées de .NET sont malheureusement assez limitées. La plupart du temps, les utilisateurs doivent déterminer la logique de fonctionnement au niveau du bit.
Dans .NET 4, la méthode a HasFlag
été ajoutée, Enum
ce qui permet de simplifier le code de l'utilisateur, mais malheureusement, il présente de nombreux problèmes.
HasFlag
n'est pas de type sécurisé car il accepte tout type d'argument de valeur enum, pas seulement le type d'énumération donné.
HasFlag
est ambigu quant à savoir s'il vérifie si la valeur a tout ou partie des indicateurs fournis par l'argument de valeur enum. C'est tout au fait.
HasFlag
est assez lent car il nécessite une boxe qui provoque des allocations et donc plus de récupérations de place.
En partie à cause de la prise en charge limitée de .NET pour les énumérations d'indicateurs, j'ai écrit la bibliothèque OSS Enums.NET qui résout chacun de ces problèmes et facilite la gestion des énumérations d'indicateurs.
Vous trouverez ci-dessous certaines des opérations qu'il fournit ainsi que leurs implémentations équivalentes utilisant uniquement le framework .NET.
Combiner les drapeaux
.NET flags | otherFlags
Enums.NET flags.CombineFlags(otherFlags)
Supprimer les drapeaux
.NET flags & ~otherFlags
Enums.NET flags.RemoveFlags(otherFlags)
Drapeaux communs
.NET flags & otherFlags
Enums.NET flags.CommonFlags(otherFlags)
Basculer les drapeaux
.NET flags ^ otherFlags
Enums.NET flags.ToggleFlags(otherFlags)
A tous les drapeaux
.NET (flags & otherFlags) == otherFlags
ouflags.HasFlag(otherFlags)
Enums.NET flags.HasAllFlags(otherFlags)
A des drapeaux
.NET (flags & otherFlags) != 0
Enums.NET flags.HasAnyFlags(otherFlags)
Obtenez des drapeaux
.NET
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()
J'essaie d'obtenir ces améliorations incorporées dans .NET Core et peut-être éventuellement le .NET Framework complet. Vous pouvez consulter ma proposition ici .