8

编辑

从海报提示中,我在 MSDN 上找到了以下有用的链接:

如何:在派生类中引发基类事件(C# 编程指南)

派生类不能引发基类事件


在重构时,我遇到了一个有趣的问题,到目前为止我还没有找到答案:

重构包括创建一个abstract实现的基类INotifyPropertyChanged,派生类型将使用它而不是自己实现接口。

派生类型可以使用基类事件PropertyChanged还是必须如下所示覆盖它?

如果他们必须override这样做,你能解释为什么应该这样吗?

(注意:Resharper 建议重构)

public abstract class BaseDTO : INotifyPropertyChanged
{
    public virtual event PropertyChangedEventHandler PropertyChanged;

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

public class ReviewDTO : BaseDTO
{
    private ImageSource _image;
    private string _summary;
    private string _url;

    public string Url
    {
        get { return _url; }
        set
        {
            if (value == _url) return;
            _url = value;
            OnPropertyChanged();
        }
    }

    public string Summary
    {
        get { return _summary; }
        set
        {
            if (value == _summary) return;
            _summary = value;
            OnPropertyChanged();
        }
    }

    public ImageSource Image
    {
        get { return _image; }
        set
        {
            if (Equals(value, _image)) return;
            _image = value;
            OnPropertyChanged();
        }
    }

    public override event PropertyChangedEventHandler PropertyChanged;
}
4

1 回答 1

5

我不认为他们必须超越。

基本类型可以定义一个

受保护的无效 RaisePropertyChanged(字符串属性名称);

派生类可以只调用基方法来触发属性通知。

刚刚找到了一些支持证据: MSDN page on implementation INotifyPropertyChanged

当然,您的基本类型可以添加更多好东西

  • 就像每个唯一的属性名称只创建一个事件参数实例(更少的垃圾对象)
  • 通过 CallerMemberName 推断属性的名称
  • 使用 lambda 表达式形式标记不正确的属性名称
于 2013-10-22T16:13:22.420 回答