Ответ 1
Самый простой вариант:
enum Foo
{
blah = 1,
....
all = ~0
}
Для перечисления без знака:
enum Foo : uint
{
blah = 1,
....
all = ~0u;
}
Интересно, как установить все биты флага enum
в 1.
Я просто хотел бы иметь enum
, который возвращается для всех сравнений, независимо от других перечислений.
И этот код работает;
[Flags]
public enum SomeRightEnum : uint
{
CanDoNothing = 0,
CanDoSomething = 1 << 0,
CanDoSomethingElse = 1 << 1,
CanDoYetAnotherThing = 1 << 2,
...
DoEverything = 0xFFFFFFFF
}
Но в приведенном выше коде, так как это uint, мы устанавливаем число "F" s, оно не работает, если оно было int
.
Итак, я ценю общий способ установки всех битов флага enum
на 1, независимо от типа данных (i
nt, int64
, uint
и т.д.)
Самый простой вариант:
enum Foo
{
blah = 1,
....
all = ~0
}
Для перечисления без знака:
enum Foo : uint
{
blah = 1,
....
all = ~0u;
}
[Flags]
public enum MyEnum
{
None = 0,
First = 1 << 0,
Second = 1 << 1,
Third = 1 << 2,
Fourth = 1 << 3,
All = ~(-1 << 4)
}
В случае, если кто-то задается вопросом:
Мне нужно было сделать одно и то же здание в виде встраиваемого enumconverter для WPF.
Поскольку я не знаю, что означают значения в Reflection, мне нужно было вручную переключить значения (привязывая их к флажку p.e.)
Существует проблема установки значения Flagged enum на -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);
}
}
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
}
Это то, что вы хотели?