День сорок пятый. #TipsAndTricks

4. Добавление методов к перечислениям

Определить метод как часть перечислимого типа напрямую невозможно. Однако это ограничение можно обойти при помощи методов расширения. Рассмотрим упоминавшееся ранее перечисление дней недели (см. день сорок третий):

[Flags]

public enum Days

{

None = 0x0,

Sunday = 0x1,

Monday = 0x2,

Tuesday = 0x4,

Wednesday = 0x8,

Thursday = 0x10,

Friday = 0x20,

Saturday = 0x40

}

Для добавления методов к перечислению нужно определить статический класс с методами расширения:

static class DaysExtensions

{

static Days GetWorkdays(this Days days)

{

// 62 – сумма значений элементов от Monday до Friday

Enum.TryParse("62", true, out days);

return days;

}



public static Days GetWeekends(this Days days)

{

// 65 – сумма значений элементов Sunday и Saturday

Enum.TryParse("65", true, out days);

return days;

}

}

Теперь эти методы можно использовать, вызывая их из экземпляра перечисления:

var d = Days.None;

Console.WriteLine("Рабочие дни: {0}", d.GetWorkdays());

Console.WriteLine("Выходные: {0}", d.GetWeekends());



// Вывод:

// Рабочие дни: Monday, Tuesday, Wednesday, Thursday, Friday

// Выходные: Sunday, Saturday