Есть ли способ добавить параметр «Все значения» в перечисление без необходимости изменять его значение каждый раз, когда в перечисление добавляется новое значение?
[Flags]
public enum SomeEnum
{
SomeValue = 1,
SomeValue2 = 1 << 1,
SomeValue3 = 1 << 2,
SomeValue4 = 1 << 3,
All = ?
}
Обновление:
] Закончил наследование от long и использование опции long.MaxValue
для всех.
Поскольку вы должны определить пустое значение в перечислении флагов, таких как None = 0
, самый простой способ определить значение All
- это просто инвертировать все биты в None
.
[Flags]
enum MyEnum
{
None = 0,
A = 1
B = 2,
C = 4,
...
All = ~None
}
Обратите внимание, что ~0
вместо ~None
не будет работать для неподписанных типов поддержки, поскольку это -1, что недопустимо для неподписанных
Редактировать: Ответ был изменено для использования инвертированного None вместо явной константы, такой как 0x7FFFFFFF или ~ 0, так как это работает и для unsigned
Перечисление может состоять из множества целочисленных типов различной длины (short, int, long). Это делает решение #FFFFFFFF
неуместным (как указано в комментарии @MarcGravell).
Перечисление может быть сделано из беззнаковых типов (uint для isntance). Это делает -1
решение неуместным.
Моя лучшая ставка - безуходная:
All = ~0
Нет, здесь нет ничего такого, что позволяет автоматически обновлять такую опцию All
при изменении Enum.
Возможно, вы захотите иметь специальное значение (значение монитора), которое означает All
(скажем, -1), даже если оно не является побитовой суммой всех опций.
Альтернативой является использование значения, в котором включены все биты:
All = 0xFFFFFFFF
public static T EnumSetAll<T>() where T : struct, Enum
{
string str = string.Join(", ", Enum.GetNames(typeof(T)));
if (Enum.TryParse<T>(str, out var e))
return e;
return default;
}