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

避免再次附加事件

  •  0
  • IordanTanev  · 技术社区  · 15 年前

    情况是这样的,我有一个控件,它在控件的定义中有事件呈现,对于这个事件是附加的处理程序,我正在寻找一种方法来显示某种消息,如果在使用此控件的某个类中,另一个处理程序附加到此事件 最好的问候, 约旦

    3 回复  |  直到 15 年前
        1
  •  0
  •   Fredrik Mörk    15 年前

    我觉得这不是一个好方法。使用事件时,控件通常不应依赖于附加的事件处理程序的数量。不管是否有0或27个事件处理程序对事件做出响应,它都应该工作。如果您希望有一种机制,在这种机制中您有更多的控制权,那么您可能应该考虑使用委托。

    如果出于某种原因限制您使用事件模型并希望控制事件处理程序的分配,一种方法可能是继承原始类,在该类中创建与基类中具有相同名称和签名的事件(使用 new 关键字,以便隐藏原始事件),并跟踪如何附加和分离事件处理程序:

    public class BaseClass
    {
        public event EventHandler SomeEvent;
    }
    
    public class MyClass : BaseClass
    {
        private int _refCount = 0;
        public new event EventHandler SomeEvent
        {
            add
            {
                if (_refCount > 0)
                {
                    // handler already attached
                }
                base.SomeEvent += value;
                _refCount++;
            }
            remove
            {
                base.SomeEvent -= value;
                _refCount--;
            }
        }
    }
    
        2
  •  2
  •   Abhinav Gujjar    15 年前

    不要公开事件。将其作为属性公开。这将使您能够在外部类附加处理程序时进行控制。

    类Myclass { 私有事件处理程序

    public event EventHandler MyEvent
    {
        [MethodImpl(MethodImplOptions.Synchronized)]
        add 
        { 
            _myEvent = (EventHandler)Delegate.Combine(_myEvent, value);
        }
        [MethodImpl(MethodImplOptions.Synchronized)]
        remove 
        { 
            _myEvent = (EventHandler)Delegate.Remove(_myEvent, value); 
        }
    }
    ...
    

    }

    这里有更多信息

    http://msdn.microsoft.com/en-us/magazine/cc163533.aspx

        3
  •  0
  •   Noon Silk    15 年前

    我搞糊涂了。

    您能检测到对“+=New EventHandler(…)”的调用吗?停下来…什么?

    我认为您只需要更好地组织代码。或者重新回答你的问题。