Метод расширения C# для проверки, установлен ли перечисление

Я хочу сделать метод расширения, чтобы проверить, имеет ли перечисление флаг.

DaysOfWeek workDays = DaysOfWeek.Monday | DaysOfWeek.Tuesday | DaysOfWeek.Wednesday;
// instead of this:
if ((workDays & DaysOfWeek.Monday) == DaysOfWeek.Monday)
   ...

// I want this:
if (workDays.ContainsFlag(DaysOfWeek.Monday))
   ...

Как я могу сделать это? (Если есть класс, который уже делает это, то я был бы признателен за объяснение того, как это можно кодировать; я слишком долго возился с этим методом!)

заранее спасибо

2 ответа

Решение

.NET 4 уже включает эту функциональность, поэтому, если возможно, обновите.

days.HasFlag(DaysOfWeek.Monday);

Если обновление невозможно, вот реализация указанного метода:

public bool HasFlag(Enum flag)
{
    if (!this.GetType().IsEquivalentTo(flag.GetType())) {
        throw new ArgumentException(Environment.GetResourceString("Argument_EnumTypeDoesNotMatch", flag.GetType(), this.GetType())); 
    }

    ulong uFlag = ToUInt64(flag.GetValue()); 
    ulong uThis = ToUInt64(GetValue());
    return ((uThis & uFlag) == uFlag); 
}

Вы можете легко построить эквивалентный метод расширения:

public static bool HasFlag(this Enum @this, Enum flag)
{
    // as above, but with '@this' substituted for 'this'
}

Я недавно столкнулся с этой проблемой.

Если вы не знаете тип Enum, вы можете привести Enum к int и использовать статические методы Enum для анализа имени поля Enum в значении и использовать op_BitwiseAnd для сравнения значений.

Я обновлю это позже с кодом, если вы заинтересованы, но сейчас выхожу за дверь.

Другие вопросы по тегам