如何设置枚举标志的所有位

AFg*_*one 37 c# enums enum-flags

我想知道将enum标志的所有位设置为1 的通用方法.我只想enum为所有比较返回一个,而不管其他枚举.

这段代码有效;

[Flags]
public enum SomeRightEnum : uint
{
    CanDoNothing = 0,
    CanDoSomething = 1 << 0,
    CanDoSomethingElse = 1 << 1,
    CanDoYetAnotherThing = 1 << 2,
    ...
    DoEverything = 0xFFFFFFFF 
}
Run Code Online (Sandbox Code Playgroud)

但是在上面的代码中,因为它是uint我们设置"F"的数量,如果是的话它将不起作用int.

所以,我会感激的所有位设置的一个通用的方法enum标志为1,而不管数据类型(iNT, int64,uint等)

lep*_*pie 58

最简单的可能是:

enum Foo
{
  blah = 1,
  ....
  all = ~0
}
Run Code Online (Sandbox Code Playgroud)

对于基于unsigned的枚举:

enum Foo : uint
{
  blah = 1,
  ....
  all = ~0u;
}
Run Code Online (Sandbox Code Playgroud)

  • @Vladius:int.MaxValue 尚未设置符号位(位 31),其值为十六进制 0x7FFFFFFF。所以只设置了 0 到 30 位。您可以将 -1 用于有符号类型,但不能用于无符号类型。仍然 ~0 是最好的。 (2认同)
  • ~0 不够好,因为你无法测试它。所有选项的组合不等于~0 (2认同)

rea*_*gos 22

[Flags]
public enum MyEnum
{
    None   = 0,
    First  = 1 << 0,
    Second = 1 << 1,
    Third  = 1 << 2,
    Fourth = 1 << 3,
    All = ~(-1 << 4)
}
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢'All =〜(〜0 << 4)`因为它更清晰一些.不是每个人都知道`-1`都是'1'. (6认同)

小智 7

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
}
Run Code Online (Sandbox Code Playgroud)

这是你想要的吗?


Sil*_*ind 5

如果有人想知道:我需要为WPF构建一个Bindable enumconverter.
由于我不知道这些值在Reflection中意味着什么,我需要手动切换值(将它们绑定到复选框pe)
将Flagged枚举的值设置为-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);
Run Code Online (Sandbox Code Playgroud)

或者,如果您需要扩展方法:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)