Тестирование значения перечисления [Flags] для одного значения - PullRequest
8 голосов
/ 02 ноября 2009

Если у меня есть enum, помеченный [Flags], есть ли способ в .NET проверить значение этого типа, чтобы увидеть, содержит ли оно только одно значение? Я могу получить желаемый результат, используя подсчет битов, но я бы предпочел использовать встроенные функции, если это возможно.

При динамическом циклическом просмотре значений enum, Enum.GetValues() также возвращает флаги комбинации. Вызов этой функции на enum в следующем примере возвращает 4 значения. Однако я не хочу, чтобы значение комбинаций было включено во внутренний алгоритм. Тестирование отдельных enum значений на равенство завершено, поскольку enum потенциально может содержать много значений, а также требует дополнительного обслуживания при изменении значений в enum.

[Flags]
enum MyEnum
{
    One = 1,
    Two = 2,
    Four = 4,
    Seven = One | Two | Four,
}

void MyFunction()
{
    foreach (MyEnum enumValue in Enum.GetValues(typeof(MyEnum)))
    {
        if (!_HasSingleValue(enumValue)) continue;

        // Guaranteed that enumValue is either One, Two, or Four
    }
}

private bool _HasSingleValue(MyEnum value)
{
    // ???
}



Связанный: StackOverflow: Enum.IsDefined на комбинированные флаги

Ответы [ 3 ]

17 голосов
/ 02 ноября 2009

Вы можете привести его к int и использовать приемы из Битовых трюков , чтобы проверить, является ли оно степенью двойки.

int v = (int)enumValue;
return v != 0 && (v & (v - 1)) == 0;
0 голосов
/ 02 ноября 2009

Вы можете Enum.GetValues ​​и считать только те элементы, которые имеют степень 2 (делятся на 2 без остатка).

0 голосов
/ 02 ноября 2009

Вы можете использовать комбинацию IsDefined и проверку на степени 2.

...