Можете ли вы запускать события с автоматическими свойствами? - PullRequest
1 голос
/ 04 ноября 2010

Мне было интересно, могу ли я использовать автоматические свойства и все еще иметь возможность запускать события для измененных свойств. Вот мои текущие занятия. (Конечно, класс пользователя получил гораздо больше свойств / полей).

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. Другими словами: возможны ли полуавтоматические свойства?

Ответы [ 3 ]

5 голосов
/ 04 ноября 2010

Вы можете использовать PostSharp .
Пример

0 голосов
/ 30 декабря 2018

Я немного изменил ваш код для доступа к событию и использования готового 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";

см. рабочая демоверсия

0 голосов
/ 10 сентября 2013

Очень поздно для вечеринки, но этот вопрос все еще появляется в Google.

Есть пакет, который работает почти так же, как пример PostSharp, но бесплатный: Fody.Propertychanged .

README проекта и ссылки на вики-страницы, на которые он ссылается, очень хорошо объясняют его.

...