Как установить все биты флага enum - PullRequest
35 голосов
/ 19 сентября 2011

Мне интересен общий способ установки всех битов флага enum в 1. Я просто хотел бы иметь enum, который возвращает для всех сравнений, независимо от других перечислений.

И этот код работает;

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

Но в приведенном выше коде, поскольку это uint, мы устанавливаем число «F», оно не будет работать, если оно будет int.

Поэтому я буду признателен за общий способ установки всех битов флага enum в 1 независимо от типа данных (i nt, int64, uint и т. Д.)

Ответы [ 4 ]

56 голосов
/ 19 сентября 2011

Самый простой, вероятно:

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

Для перечисления без знака:

enum Foo : uint
{
  blah = 1,
  ....
  all = ~0u;
}
21 голосов
/ 22 апреля 2014
[Flags]
public enum MyEnum
{
    None   = 0,
    First  = 1 << 0,
    Second = 1 << 1,
    Third  = 1 << 2,
    Fourth = 1 << 3,
    All = ~(-1 << 4)
}
6 голосов
/ 19 сентября 2011
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
}

Это то, что вы хотели?

5 голосов
/ 08 марта 2012

В случае, если кому-то интересно: мне нужно было сделать то же самое для создания Bindable enumconverter для WPF.Поскольку я не знаю, что означают значения в Reflection, мне нужно было вручную переключать значения (связывая их с флажком pe).Существует проблема установки значения перечисляемого перечисления на -1, чтобы установить все биты.Если вы установите его равным -1, и все значения будут отменены, это не приведет к 0, поскольку все неиспользуемые биты не будут помечены.Это Ват работал лучше всего для моей ситуации.

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);

Или, если вы хотите метод расширения:

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);
    }
}
...