在某些情况下如何修改委托以设置其 return 值的 属性

How to modify delegate to set a property of its return value in certain cases

我为糟糕的标题道歉,我不知道如何用文字表达。

假设以下情况:

实现此接口的假日结构:

public interface IHoliday
{
    HolidayName Name { get; }
    DateTime Date { get; }
    bool IsRegional { get; set; }
}

一个 HolidayCalculator class 有几种方法可以根据给定的年份计算各种假期:

public static class HolidayCalculator
{
    public static IHoliday GetAssumptionDay(int year)
    {
        CheckYear(year);
        return new Holiday(GetHolidayName(), new DateTime(year, 8, 15));
    }

    // and so on...
}

一个 HolidayFunc 委托和一个 HolidayStateMap class,它继承自 Dictionary 以将某些假期映射到它们各自的状态:

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
        });
    }
}

要获取给定州的所有假期,您可以:

var holidayFunctions = _holidayStateMap[state];
var holidays = holidayFunctions.Select(function => function(year));

问题:

某些州的某些假期仅在某些地区庆祝。这意味着假设日可以在一个州的所有地区庆祝,但只能在另一个州的某些地区庆祝。

我现在想在为 state1 而不是 state2 调用委托时设置 IsRegional 属性。所有这一切,都没有改变我当前的设置。

是否有可能以某种方式拦截我正在调用的委托的 return 值 (Holiday) 并将 true 注入 IsRegional 属性 必要时。也许通过包装我的代表,我在填充 HolidayStateMap:

时想象这样的事情
if (includeRegional)
{
    this[State.Bavaria].AddRange(new HolidayFunc[]
    {
        HolidayCalculator.GetAssumptionDay.AsRegional,
        HolidayCalculator.GetPeaceFestival.AsRegional
    });

    // and others...
{

然后 return 相应的 Holiday 但 IsRegional 设置为 true。

为了扩展方法,我想实现看起来有点像这样:

public static IHoliday AsRegional(this HolidayFunc func, int year)
{
    var holiday = func.Invoke(year);
    holiday.IsRegional = true;
    return holiday;
}

(我知道我需要一个委托实例才能工作)

也许有人可以想出一个巧妙的解决方案,我有点卡住了。 提前致谢。

PS:我知道我可能设计过度了,但是……

我的天啊

我基本上在描述中自己回答了问题:

(I know I would need an instance of the delegate for this to work)

解决方案是:

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

很抱歉。 谢谢@Jeroen van Langen 的尝试。