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

问题描述 投票:1回答:1

我为这个卑鄙的标题表示歉意,我不知道该如何用语言表达。

假设以下情况:

实现此接口的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...
}

一个HolidayFunc委托和一个HolidayStateMap类,该类从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属性。所有这些,无需更改我的当前设置。

是否可以某种方式截获我正在调用的委托的返回值(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:我知道我可能对此进行了过度设计,但是很好。。

c# delegates extension-methods
1个回答
0
投票

哦,我的上帝。

我基本上在说明中回答了这个问题:

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

解决方案是:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.