getter和setter中的冗余代码

时间:2015-08-19 16:17:54

标签: c# properties dry getter-setter

我有一个类需要在更改任何属性时调用方法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(); } } // ....... 。我在例子中看到的是:

Date | Item | Invoice_number

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

3 个答案:

答案 0 :(得分:4)

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

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

也就是说,如果您选择使用它们,会有一些框架(MVVMLight,Caliburn.Micro)为您注入事件加注。当然,它们只是给你一点合成糖,最终结果是一样的。

答案 1 :(得分:2)

您可能想尝试使用AOP框架来实现INotifyPropertyChanged。我个人对此示例的最爱是Fody.

你会写这样的课......

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

Fody的工作原理是在MsBuild完成之后重写你的dll,以实现你的INPC代码。

答案 2 :(得分:0)

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