Я прошу прощения за дерьмовый заголовок, я не знаю, как выразить это словами.
Предположим, что следующий сценарий:
Структура Holiday, реализующая этот интерфейс:
public interface IHoliday
{
HolidayName Name { get; }
DateTime Date { get; }
bool IsRegional { get; set; }
}
Класс HolidayCalculator с несколькими методами для расчета различных праздников на основе заданного года:
public static class HolidayCalculator
{
public static IHoliday GetAssumptionDay(int year)
{
CheckYear(year);
return new Holiday(GetHolidayName(), new DateTime(year, 8, 15));
}
// and so on...
}
Делегат HolidayFun c и класс HolidayStateMap, который наследует из словаря для сопоставления определенных праздников с их соответствующими штаты:
public delegate IHoliday HolidayFunc(int year);
public class HolidayStateMap : Dictionary<State, List<HolidayFunc>>
{
public HolidayStateMap()
{
// add keys (State) with nation-wide holidays
// add state specific holidays
this[State.Bavaria].AddRange(new HolidayFunc[]
{
HolidayCalculator.GetEpiphany,
HolidayCalculator.GetCorpusChristi,
HolidayCalculator.GetAllSaintsDay
});
}
}
Чтобы получить все праздничные дни для данного штата, вы go:
var holidayFunctions = _holidayStateMap[state];
var holidays = holidayFunctions.Select(function => function(year));
Вопрос:
В некоторые праздники, в некоторых государства, отмечаются только в определенных регионах. Значение Предположительный день можно отмечать во всех регионах одного штата, но только в некоторых регионах другого.
Теперь я хотел бы установить свойство IsRegional
, когда делегат вызывается для состояния1, но не для состояния2. Все это без изменения моих текущих настроек.
Возможно ли каким-то образом перехватить возвращаемое значение (Holiday
) вызываемого мной делегата и вставить true
в свойство IsRegional
где необходимо. Может быть, оборачивая моего делегата, я воображаю что-то подобное при заполнении HolidayStateMap
:
if (includeRegional)
{
this[State.Bavaria].AddRange(new HolidayFunc[]
{
HolidayCalculator.GetAssumptionDay.AsRegional,
HolidayCalculator.GetPeaceFestival.AsRegional
});
// and others...
{
, которое затем возвращает соответствующий Holiday
, но с IsRegional, установленным в true.
Идет для метода расширения я бы изобразил, что реализация выглядит примерно так:
public static IHoliday AsRegional(this HolidayFunc func, int year)
{
var holiday = func.Invoke(year);
holiday.IsRegional = true;
return holiday;
}
(я знаю, что для работы мне понадобится экземпляр делегата)
Может быть, кто-то может придумать аккуратное решение, я вроде застрял. Заранее спасибо.
PS: Я знаю, что могу переусердствовать в этом, но хорошо ..