【问题标题】:How to raise events defined using Event Properties如何引发使用事件属性定义的事件
【发布时间】:2011-10-15 06:10:25
【问题描述】:

我正在学习活动和代表,现在开始参加多个活动。只是文档没有提供任何信息或代码示例来引发以这种方式定义的事件。您可以在下面找到一个简单的示例

示例代码

public class Person
    {
        private string _name;
        private string _phone;

        public string Name
        {
            get { return _name; }
            set
            {
                _name = value;
            }
        }

        public string Phone
        {
            get { return _phone; }
            set
            {
                _phone = value;
            }
        }

        protected EventHandlerList EventDelegateCollection = new EventHandlerList();

        //define the event key
        static readonly object PhoneChangedEventKey = new object();
        public event EventHandler PhoneChanged
        {
            add
            {
                EventDelegateCollection.AddHandler(PhoneChangedEventKey, value);
            }
            remove
            {
                EventDelegateCollection.RemoveHandler(PhoneChangedEventKey, value);
            }
        }
    }

我想在设置电话号码时引发事件。如果有什么听起来很时髦并且不明白我在说什么see here

更新

我想在这里澄清一些疑问。有两种方法可以实际订阅和调用事件处理程序的经典模式(as described here),其中的步骤是

  • 定义充当订阅方法签名的委托。
  • 定义委托的事件
  • 定义引发处理程序的方法 note: 上述方法为每个事件创建字段,因此消耗更多内存 reference

事件属性是您在下面执行的另一种方式

  • 定义一个对象作为事件的关键
  • 定义一个方法来为事件调用列表中的事件添加和删除处理程序
  • 通过根据事件键确定事件处理程序来引发事件

【问题讨论】:

标签: c# events memory-management event-handling


【解决方案1】:

这才是你真正应该提高它的方式

代码

public class Person
{
    private string _name;
    private string _phone;

    public string Name
    {
        get { return _name; }
        set
        {
            _name = value;
        }
    }

    public string Phone
    {
        get { return _phone; }
        set
        {
            _phone = value;
            //Invoke the Handlers now
            OnPhoneChanged();
        }
    }

    protected EventHandlerList EventDelegateCollection = new EventHandlerList();
    static readonly object PhoneChangedEventKey = new object();
    public event EventHandler PhoneChanged
    {
        add
        {
            EventDelegateCollection.AddHandler(PhoneChangedEventKey, value);
        }
        remove
        {
            EventDelegateCollection.RemoveHandler(PhoneChangedEventKey, value);
        }
    }

    private void OnPhoneChanged()
    {
        EventHandler subscribedDelegates = (EventHandler)this.EventDelegateCollection[PhoneChangedEventKey];
        subscribedDelegates(this, EventArgs.Empty);
    }
}

【讨论】:

    【解决方案2】:

    我建议你阅读Delegates and Events in C#。下面的代码就是你想要的。

    public class Person
    {
        public event EventHandler<string> PhoneNumberChanged;
    
        private string _name;
        private string _phone;
    
        public string Name
        {
            get { return _name; }
            set
            {
                _name = value;
            }
        }
    
        public string Phone
        {
            get { return _phone; }
            set
            {
                _phone = value;
    
                if (this.PhoneNumberChanged != null)
                {
                    this.PhoneNumberChanged(this._phone);
                }
            }
        }
    }
    

    【讨论】: