我为这个卑鄙的标题表示歉意,我不知道该如何用语言表达。
实现此接口的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:我知道我可能对此进行了过度设计,但是很好。。
哦,我的上帝。
我基本上在说明中回答了这个问题:
(我知道我需要一个委托实例才能正常工作)
解决方案是:
if (includeRegional)
{
this[State.Bavaria].AddRange(new HolidayFunc[]
{
new HolidayFunc(HolidayCalculator.GetAssumptionDay).AsRegional,
new HolidayFunc(HolidayCalculator.GetPeaceFestival).AsRegional
});
}
抱歉。谢谢@Jeroen van Langen的尝试。