web-dev-qa-db-fra.com

Comment définir tous les morceaux de drapeau de l'énum

Je me demande une manière générique pour définir tous les morceaux de enum Drapeau à 1. Je voudrais juste avoir un enum qui retourne pour toutes les comparaisons, quels que soient les autres Enums.

Et ce code fonctionne;

[Flags]
public enum SomeRightEnum : uint
{
    CanDoNothing = 0,
    CanDoSomething = 1 << 0,
    CanDoSomethingElse = 1 << 1,
    CanDoYetAnotherThing = 1 << 2,
    ...
    DoEverything = 0xFFFFFFFF 
}

Mais au code ci-dessus depuis que c'est UINT, nous définissons le nombre de "F", cela ne fonctionnerait pas si c'était int.

Je vais donc apprécier une manière générique de définir tous les bits de enum indicatrice à 1, quel que soit le type de données (int, int64, uint etc)

39
AFgone

Le plus facile est probablement:

enum Foo
{
  blah = 1,
  ....
  all = ~0
}

Pour un Enum basé non signé:

enum Foo : uint
{
  blah = 1,
  ....
  all = ~0u;
}
61
leppie
[Flags]
public enum MyEnum
{
    None   = 0,
    First  = 1 << 0,
    Second = 1 << 1,
    Third  = 1 << 2,
    Fourth = 1 << 3,
    All = ~(-1 << 4)
}
24
realstrategos
internal static class Program
{
    private static void Main()
    {
        Console.WriteLine(Foo.Everything.HasFlag(Foo.None)); // False
        Console.WriteLine(Foo.Everything.HasFlag(Foo.Baz)); // True
        Console.WriteLine(Foo.Everything.HasFlag(Foo.Hello)); // True
    }
}

[Flags]
public enum Foo : uint
{
    None = 1 << 0,
    Bar = 1 << 1,
    Baz = 1 << 2,
    Qux = 1 << 3,
    Hello = 1 << 4,
    World = 1 << 5,
    Everything = Bar | Baz | Qux | Hello | World
}

Était-ce ce que tu voulais?

8
Scott

Au cas où quelqu'un se demande: J'avais besoin de faire le même bâtiment un encombrement obligatoire pour WPF.
[.____] Comme je ne sais pas quelles sont les valeurs de réflexion, j'avais besoin de changer manuellement de changer de valeur (les lier à une case à cocher P.E.)
[.____] Il y a un problème définissant la valeur d'un Enum signalé à -1 pour définir tous les bits.
[.____] Si vous le définissez à -1 et que vous non enflammez toutes les valeurs, il n'entraînera pas 0 parce que tous les bits inutilisés ne sont pas incomprérés.
[.____] C'est ce que Wat a fonctionné mieux pour ma situation.

SomeRightEnum someRightEnum = SomeRightEnum.CanDoNothing;
Type enumType = someRightEnum.GetType();
int newValue = 0;
var enumValues = Enum.GetValues(enumType).Cast<int>().Where(e => e == 1 || e % 2 == 0);
foreach (var value in enumValues)
{
    newValue |= value;
}
Console.WriteLine(newValue);

Ou si vous voulez une méthode d'extension:

public static class FlagExtensions
{
    public static TEnum AllFlags<TEnum>(this TEnum @enum)
        where TEnum : struct
    {
        Type enumType = typeof(TEnum);
        long newValue = 0;
        var enumValues = Enum.GetValues(enumType);
        foreach (var value in enumValues)
        {
            long v = (long)Convert.ChangeType(value, TypeCode.Int64);
            if(v == 1 || v % 2 == 0)
            {
               newValue |= v; 
            }
        }
        return (TEnum)Enum.ToObject(enumType , newValue);
    }
}
5
Silvermind