getter 和 setter 中的冗余代码

Redundant code in getters and setters

我有一个 class 需要在其任何属性更改时调用方法 NotifyPropertyChanged。我在例子中看到的是这样的:

private string property1_;
public string Property1
{
    get { return property1_; }
    set { property1_ = value; NotifyPropertyChanged(); }
}
private string property2_;
public string Property2
{
    get { return property2_; }
    set { property2_ = value; NotifyPropertyChanged(); }
}
// .......

这真的是惯用的方法吗?对于我要添加的每个 属性,它都需要几行样板。此外,如果我想更改 属性 和字段的名称,我需要更改 4 个不同的东西。好像违反了DRY。

是的,这是提高 PropertyChanged 的惯用方式。没有简单的解决方法,因为 setter 需要额外的方法调用,而唯一的方法是使用完整的 属性 和支持字段。

它实际上曾经更糟,因为在 .NET 4.5 之前,您必须将 属性 名称作为字符串传递给 "NotifyPropertyChanged",因此现在更改名称实际上要容易得多。

也就是说,如果您选择使用框架(MVVMLight,Caliburn.Micro),它们会为您注入事件引发。当然,他们只是给你一点语法糖,最后的结果是一样的。

您可能想尝试使用 AOP 框架来实现您的 INotifyPropertyChanged。我个人最喜欢这个例子叫做 Fody.

你会这样写 class...

[ImplementPropertyChanged]
public class Foo
{
    public string Property1 { get; set; }
    public string Property2 { get; set; }
}

Fody 通过在 MsBuild 完成后重写您的 dll 来实现您的 INPC 代码。

PostSharp (https://www.postsharp.net/model/inotifypropertychanged) 是另一个编译时选项,用于自动生成 INotifyPropertyChanged 事件引发,它使用属性来指示应该完成此操作的方法。