我有一个改变颜色的类Shape,它应该在发生更改时通知订阅者。但是,订阅者希望收到如下通知:
/backend/
,green
或yellow
red
这是我的Shape类
red
我的订阅者
public class Shape
{
public event EventHandler ColorChanged;
void ChangeColor()
{
// set new color
OnColorChanged(...);
}
protected virtual void OnColorChanged(MyEventArgs e)
{
if(ColorChanged != null)
{
ColorChanged(this, e);
}
}
}
如何让Shape在其首选条件下通知这些订阅者颜色变化(即我希望仅在您的颜色变为红色时才会收到通知?)
我看到的每个示例都会通知所有订阅者所有更改,我正在努力使其成为
答案 0 :(得分:0)
您必须为每个不同的可能订阅选项维护一个代表列表:
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
枚举中的值。 这可能是可能的,但我不会向没有明确和绝望需要的人推荐它。