Как изменить делегат для установки свойства его возвращаемого значения в определенных случаях - PullRequest
1 голос
/ 24 февраля 2020

Я прошу прощения за дерьмовый заголовок, я не знаю, как выразить это словами.

Предположим, что следующий сценарий:

Структура 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: Я знаю, что могу переусердствовать в этом, но хорошо ..

1 Ответ

0 голосов
/ 24 февраля 2020

Боже мой.

Я сам ответил на вопрос в описании:

(я знаю, что для работы мне понадобится экземпляр делегата)

Решение было:

if (includeRegional)
{
    this[State.Bavaria].AddRange(new HolidayFunc[]
    {
        new HolidayFunc(HolidayCalculator.GetAssumptionDay).AsRegional, 
        new HolidayFunc(HolidayCalculator.GetPeaceFestival).AsRegional
    });
}

Извините за это. Спасибо @Jeroen van Langen за попытку.

...