Использование атрибутов ... INotifyPropertyChanged - PullRequest
6 голосов
/ 02 ноября 2009

Это просто то, о чем я думал, когда я изучал атрибуты, и я слишком много использовал INotifyPropertyChanged, это просто, и идея, и я хотел бы услышать некоторые мнения об этом (я знаю, что это потребует некоторой работы над компилятор, а не на стороне потребителя)

Поскольку INotifyPropertyChanged используется с одним и тем же шаблоном большую часть времени ... точно так же, как вызов метода, который запускает событие с именем свойства, может ли он быть спроектирован как и атрибут и с использованием авто-свойств? Чтобы компилятор знал, что нужно добавить вызов в событие PropertyChanged? Так что, если у нас есть класс ....

public class DemoCustomer : INotifyPropertyChanged
{
  public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }

  private string companyNameValue = String.Empty;
         ...
}

Вместо объявления свойства

public string CompanyName
    {
        get
        {
            return this.companyNameValue;
        }

        set
        {
                       if (value != this.companyNameValue)
                       {
                          this.companyNameValue = value;
                          NotifyPropertyChanged("CompanyName");
                       }
        }
    }

мы могли бы сделать что-то подобное, если мы можем указать компилятору по этому атрибуту, что он должен сгенерировать вызов PropertyChanged с именем свойства, если новое значение отличается от предыдущего

[NotifyPropertyChanged]
public string CompanyName
{
  get;set;
}

Мы все еще могли бы сохранять кодирование по-старому для некоторых нестандартных поведений, если не использовать Атрибут ..

Ответы [ 3 ]

8 голосов
/ 02 ноября 2009

Вы можете сделать это с PostSharp , но я не думаю, что это будет в основном компиляторе в ближайшее время.

8 голосов
/ 29 ноября 2013

В случае, если кто-то встречается в этом потоке и использует C # 5 (VS 2012+, .NET 4.5+). В этом случае теперь «проще» сделать с помощью CallerMemberNameAttribute. Этот атрибут применяется к строковому параметру и заставляет компилятор передавать имя вызывающего метода / свойства, когда используется используемое нами значение по умолчанию (то есть, когда аргумент и не передается). Делать реализацию INotifyPropertyChanged менее утомительной. Например:

public class MyClass
{
    private string myProperty;

    public string MyProperty
    {
        get { return myProperty; }
        set
        {
            myProperty = value;
            OnPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        var handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

Итак, вам просто нужно OnPropertyChanged() в каждом установщике для отправки события, и вам не нужно иметь дело с жестко закодированной строкой для имени свойства.

5 голосов
/ 02 ноября 2009

Этот стиль мышления называется Аспектно-ориентированным программированием (или АОП). Вы можете достичь конечного результата, добавив действие посткомпоновки, используя Сесил из Mono, чтобы просмотреть свойства с этим атрибутом, изменить поведение свойства и выпустить только что скомпилированную сборку с соответствующим поведением. Вы можете посмотреть Джейсон Бок Dimecast на " Использование Cecil для внедрения кода в ваши сборки "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...