您必须为每个可能的订阅选择维护一个代表列表:
private Dictionary<Color, EventHandler> colorChangedHandlers;
private EventHandler color_changed_to_red;
private EventHandler color_changed_to_yellow;
.
.
.
// then, add all of the delegates to the list
订阅者必须打电话
shapeInstance.SubscribeColorChanged(EventHandler handler, params Color[] desiredColors);
然后,您必须实现它,比如:
public void SubscribeColorChanged(EventHandler handler, params Color[] colors)
{
foreach (Color c in colors)
{
colorChangedHandlers[c] += handler;
}
}
当然,你需要一个伴侣
Unsubscribe
方法,以及:
public void UnsubscribeColorChanged(EventHandler handler, params Color[] desiredColors)
{
foreach (Color c in desiredColors)
{
foreach (KeyValuePair<Color, EventHandler> kvp in colorChangedHandlers)
{
if (kvp.Key == c) {
EventHandler tmp = kvp.Value;
tmp -= handler;
}
}
}
}
然后,你必须改变你的
OnColorChanged
方法
protected virtual void OnColorChanged(Color color)
{
colorChangedEventHandlers[color]?.Invoke(this, EventArgs.Empty);
}
所有这些都是为了
ColorChanged
可以使用
NewColor
的派生类上的属性
EventArgs
!! 此外,对于自定义颜色,它必须更加复杂,因为它只处理
Colors
枚举。
这也许是可能的,但如果没有明确而绝望的需求,我不会推荐给任何人。