Перечисления - значение всех параметров

Есть ли способ добавить параметр «Все значения» в перечисление без необходимости изменять его значение каждый раз, когда в перечисление добавляется новое значение?

[Flags] 
public enum SomeEnum
{
    SomeValue =  1,
    SomeValue2 = 1 << 1,
    SomeValue3 = 1 << 2,
    SomeValue4 = 1 << 3,
    All = ?
}

Обновление:

] Закончил наследование от long и использование опции long.MaxValue для всех.

23
задан Luke Girvin 14 April 2016 в 10:14
поделиться

4 ответа

Поскольку вы должны определить пустое значение в перечислении флагов, таких как None = 0, самый простой способ определить значение All - это просто инвертировать все биты в None.

[Flags]
enum MyEnum
{
   None = 0,
   A = 1
   B = 2,
   C = 4,
   ...
   All = ~None
}

Обратите внимание, что ~0 вместо ~None не будет работать для неподписанных типов поддержки, поскольку это -1, что недопустимо для неподписанных

Редактировать: Ответ был изменено для использования инвертированного None вместо явной константы, такой как 0x7FFFFFFF или ~ 0, так как это работает и для unsigned

35
ответ дан 29 November 2019 в 01:15
поделиться

Перечисление может состоять из множества целочисленных типов различной длины (short, int, long). Это делает решение #FFFFFFFF неуместным (как указано в комментарии @MarcGravell).

Перечисление может быть сделано из беззнаковых типов (uint для isntance). Это делает -1 решение неуместным.

Моя лучшая ставка - безуходная:

All = ~0
4
ответ дан 29 November 2019 в 01:15
поделиться

Нет, здесь нет ничего такого, что позволяет автоматически обновлять такую ​​опцию All при изменении Enum.

Возможно, вы захотите иметь специальное значение (значение монитора), которое означает All (скажем, -1), даже если оно не является побитовой суммой всех опций.

Альтернативой является использование значения, в котором включены все биты:

All = 0xFFFFFFFF
2
ответ дан 29 November 2019 в 01:15
поделиться
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;
  }
0
ответ дан 29 November 2019 в 01:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: