INotifyChangedProperty 动态实现

INotifyChangedProperty dynamic implementation

在大多数 tuts 中,他们说要这样写方法:

    private void OnPropertyChanged(string prop)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(prop));
        }
    }

并称它为 OnPropertyChanged("PropName");。但这似乎是非常静态的,无法自动重构。有没有办法更动态地做到这一点?我考虑过使用 System.Diagnostic.StackTrace class 来获取 属性 的名称,但它看起来很丑而且效率不高,而且我无法访问它,例如 Windows Phone 8 个应用程序(为什么!?)。

Caliburn.micro 有一个 PropertyChangeBase 允许您使用 lambda。您可以从它继承并调用基本方法。对于 属性 Name 你可以这样做:

NotifyOfPropertyChange(() => Name);

使用 C# 6.0,您可以实现自己的基础 class 并使用 nameof 运算符,这将有助于重构:

OnPropertyChanged(nameof(Name));

如果您使用的是 .NET Framework 4.5,则可以使用 [CallerMemberName]

因此您的代码将是:

using System.Runtime.CompilerServices;

class BetterClass : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    // Check the attribute in the following line :
    private void FirePropertyChanged([CallerMemberName] string propertyName = null)
    {
        var handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyName));
    }

    private int sampleIntField;

    public int SampleIntProperty
    {
        get { return sampleIntField; }
        set
        {
            if (value != sampleIntField)
            {
                sampleIntField = value;
                // no "magic string" in the following line :
                FirePropertyChanged();
            }
        }
    }
}

如问题中所述INotifyPropertyChanged : is [CallerMemberName] slow compared to alternatives?