1

我想知道我是否可以使用自动属性并且仍然能够在属性更改时触发事件。这是我目前的课程。(当然,实际的 User 类有更多的属性/字段)。

public delegate void UserEventHandler(object sender, EventArgs e);

public class User
{
    public event UserEventHandler Changed;

    private string _UserName;
    public string UserName
    {
        get
        {
            return _UserName;
        }
        private set
        {
            _UserName = value;
            this.OnChanged(EventArgs.Empty);
        }
    }

    protected void OnChanged(EventArgs e)
    {
        if (Changed != null)
        {
            Changed(this, e);
        }
    }
}

所以我想知道是否有一种方法可以利用自动属性并且仍然能够触发 OnChanged 事件。换句话说:半自动属性可能吗?

4

3 回答 3

5

您可以使用PostSharp
例子

于 2010-11-04T15:12:23.370 回答
1

聚会很晚,但这个问题仍然出现在谷歌上。

有一个包的工作方式与 PostSharp 示例大致相同,但它是免费的:Fody.Propertychanged

该项目的 README 及其链接的 wiki 页面很好地解释了它。

于 2013-09-10T07:13:21.883 回答
0

我稍微修改了您的代码,以便可以访问并使用现成的 EventHandler。

    public class User
    {
        public event EventHandler AgeChanged;     
        private string _UserName;
        public string UserName
        {
            get
            {
                return _UserName;
            }
             set  
            {
                _UserName = value;
                this.OnAgeChanged(this,EventArgs.Empty);
            }
        }

        protected virtual void OnAgeChanged(object sender, EventArgs e)
        {
            if (AgeChanged != null)
            {
                AgeChanged(sender, e);
            }
        }
   }

如何设置事件:

      var user = new User();
     //subscribe to events
     user.AgeChanged+= (s,e) => Console.WriteLine("UserNamed changed to {0}",user.UserName);

    //modify UserName and now event is fired
     user.UserName="Jack";

看一个工作演示

于 2018-12-30T08:53:40.670 回答