在某些情况下如何修改委托以设置其 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 的尝试。
我为糟糕的标题道歉,我不知道如何用文字表达。
假设以下情况:
实现此接口的假日结构:
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 的尝试。