如何在此处减少代码重复?当然,我可以用反射或泛型来做到这一点?

时间:2013-05-01 14:29:51

标签: c# refactoring

我正在使用WPF和MVVM,因此我的视图模型中有很多属性绑定到视图中的东西。这些属性中的大多数看起来像这样......

private DateTime _newRevisionDate = DateTime.Now;

public DateTime NewRevisionDate {
  get {
    return _newRevisionDate;
  }
  set {
    if (_newRevisionDate != value) {
      _newRevisionDate = value;
      RaisePropertyChanged(ViewModelUtils.GetPropertyName(() => NewRevisionDate));
    }
  }
}

我正在使用MvvmLight,这是RaisePropertyChanged()方法的来源,并使用ViewModelUtils.GetPropertyName()方法从属性名称创建一个字符串,从而避免使用魔术字符串。

现在,问题在于如果我向视图模型添加一些这样的属性,我最终会得到大量几乎完全相同的代码。这只是为了一些巧妙的重构而烦恼,所以我可以使用一行代码来定义每个属性。

但是,我还没有办法找到任何办法。什么是好的是能够做类似标准的C#自动属性......

public DateTime NewRevisionDate { get; set; }

...但只要将属性设置为新值,就让它调用RaisePropertyChanged()。

任何想法?感谢

1 个答案:

答案 0 :(得分:3)

  

这只是急于进行一些巧妙的重构,所以我可以使用一行代码来定义每个属性。

你现在可以把它变成一条线。它只是一个行:)

C#5使用caller info attributes使这更容易一些,因此您不需要GetPropertyName部分 - 这是您当前代码中最丑陋的部分。

你可以做的另一件事是:

set
{
  _newRevisionDate = PossiblyFireEvent(RaisePropertyChanged, _newRevisionDate, value);
}

其中PossiblyFireEvent将属性名称作为可选参数使用调用者信息属性,RaisePropertyChanged作为委托,如果两个值不相等则执行,并始终返回value。不确定它是否值得。