Я пытаюсь проверить, содержит ли «экземпляр enum» более одного флага. Мне все равно, какие флаги содержит «экземпляр», я просто хочу знать, существует ли более одного
Кроме того, я действительно не хочу использовать что-то вроде следующего:
var state = Foo.Bar | Foo.Far;
Console.WriteLine(state.ToString().Count(x => x == ',') > 0); // True
Существует более чем несколько различных способов достижения sh того, что вы хотите, я предлагаю сделать небольшую (побитовую) проверку:
public static bool MoreThanOneFlag<TValue>(TValue flag) where TValue : Enum => (Convert.ToInt32(flag) & (Convert.ToInt32(flag) - 1)) != 0;
В приведенном выше блоке кода мы проверяем, flag
не является степенью двойки путем проверки с использованием flag & (flag-1)) != 0
(оператор &), который вычисляет побитовое логическое И своих операндов. Если установлен только один флаг, мы предполагаем, что значение будет степенью двойки, в противном случае это не степень двойки.
Или, если вы не хотите, чтобы вспомогательная функция просто выполняла эту проверку в любом месте :
bool value = (multiState & (multiState -1)) != 0;
Для получения дополнительной информации о побитовом режиме, , пожалуйста, ознакомьтесь с здесь.
Ссылки:
Битовые и сдвиговые операторы ( C# ссылка)