Метод расширения 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 для сравнения значений.
Я обновлю это позже с кодом, если вы заинтересованы, но сейчас выхожу за дверь.