代码之家  ›  专栏  ›  技术社区  ›  pixel

C#根据订阅者的要求通知订阅者的事件

  •  -1
  • pixel  · 技术社区  · 7 年前

    我有一个更改颜色的类形状,它应该在发生更改时通知订阅者。但是,订阅者希望得到如下通知:

    • 认购人1 希望仅在形状颜色更改为时收到通知 green , yellow red
    • 订阅人2 希望仅在形状颜色更改为时收到通知 红色
    • 认购人3 希望在形状颜色更改为 任何 颜色

    这是我的形体课

    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);  
            }  
        }  
    } 
    

    和我的订阅者

    public class Subscriber1
    {
        public Subscriber1(Shape shape)
        {
            shape.ColorChanged += new EventHandler(OnColorChanged);
        }
    
        void OnColorChanged(object sender, EventArgs e)
        {
            // this subscriber wants to get notified only if color changes to green, yellow and red
        }
    }
    
    public class Subscriber2
    {
        public Subscriber2(Shape shape)
        {
            shape.ColorChanged += new EventHandler(OnColorChanged);
        }
    
        void OnColorChanged(object sender, EventArgs e)
        {
            // this subscriber wants to get notified only if color changes to red
        }
    }
    
    public class Subscriber3
    {
        public Subscriber3(Shape shape)
        {
            shape.ColorChanged += new EventHandler(OnColorChanged);
        }
    
        void OnColorChanged(object sender, EventArgs e)
        {
            // this subscriber wants to get notified every time shape color changes
        }
    }
    

    我如何让Shape通知这些订阅者其首选条件的颜色变化(即,仅当您的颜色变为红色时,我才希望得到通知)?

    我看到的每个示例都会通知所有订阅者所有更改,我正在尝试使其

    • 订阅者可以告诉他们想要通知的更改的形状
    • Shape然后只通知这些订阅者他们要求的内容
    1 回复  |  直到 7 年前
        1
  •  0
  •   Mark Benningfield    7 年前

    您必须为每个可能的订阅选择维护一个代表列表:

    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 枚举。 这也许是可能的,但如果没有明确而绝望的需求,我不会推荐给任何人。