实现 INotifyPropertyChanged 时,C# 中的 [NotifyPropertyChangedInvocator] 是啥?

Posted

技术标签:

【中文标题】实现 INotifyPropertyChanged 时,C# 中的 [NotifyPropertyChangedInvocator] 是啥?【英文标题】:What is [NotifyPropertyChangedInvocator] in C# when implements INotifyPropertyChanged?实现 INotifyPropertyChanged 时,C# 中的 [NotifyPropertyChangedInvocator] 是什么? 【发布时间】:2014-06-06 10:44:12 【问题描述】:

我看到INotifyPropertyChanged的两种实现方式

第一个:

public abstract class ViewModelBase : INotifyPropertyChanged

    public event PropertyChangedEventHandler PropertyChanged;

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

第二个:

public abstract class ViewModelBase : INotifyPropertyChanged

    public event PropertyChangedEventHandler PropertyChanged;

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

在第二个中,您会看到方法 OnPropertyChanged 上有一个额外的属性 [NotifyPropertyChangedInvocator]

在我的情况下,两者的行为相同,但是什么,为什么以及何时使用这个[NotifyPropertyChangedInvocator],这样做有什么好处?我在互联网上搜索过,但找不到任何好的答案。

【问题讨论】:

【参考方案1】:

NotifyPropertyChangedInvocator 是 Resharper 功能。

您只需将其从代码中删除即可使其正常工作

在这里提出了类似的问题:

does anyone know how to get the [NotifyPropertyChangedInvocator]

【讨论】:

是 C# 功能。 Resharper 只是一个工具,不能添加任何不支持 c# 的额外代码。 NotifyPropertyChangedInvocator 背后也有一些东西。 然后你说 [CallerMemberName] 也是由 Resharper 添加的,通过删除代码也可以,但是 CallMemberName 解决了在我们调用它的地方提供名称或属性的头痛。同样,我想了解 NotifyPropertyChangedInvocator 在这里查看kunal-chowdhury.com/2012/07/whats-new-in-c-50-learn-about.html @WaqasIdrees 你能发布 NotifyPropertyChangedInvocator 的链接或文档以证明它带有 C# +0, -1 对于plagiarizing 简单地说你可以从你的代码中删除NotifyPropertyChangedInvocator'为了让它工作'并不能回答这个问题。【参考方案2】:

这是来自他们Annotations 的 Resharper 属性 - 旨在向您发出警告,然后您的代码看起来很可疑 :) 考虑一下:

public class Foo : INotifyPropertyChanged 

     public event PropertyChangedEventHandler PropertyChanged;

     [NotifyPropertyChangedInvocator]
     protected virtual void NotifyChanged(string propertyName)  ... 

     private string _name;
     public string Name 
       get  return _name; 
       set  
             _name = value; 
             NotifyChanged("LastName");//<-- warning here
            
     
   

使用NotifyChanged 方法上的[NotifyPropertyChangedInvocator] 属性Resharper 会给你一个警告,你正在调用具有(可能)错误值的方法。 因为 Resharper 现在知道应该调用 方法来发出更改通知,它会帮助您将普通属性转换为具有更改通知的属性: 转换成这个:

public string Name

  get  return _name; 
  set
  
    if (value == _name) return;
    _name = value;
    NotifyChange("Name");
  

此示例来自此处的 [NotifyPropertyChangedInvocator] 属性文档:

【讨论】:

加 1 用于解释,而不仅仅是用链接回答。应该选择这个作为答案。 我不明白.. 给出了什么警告,为什么,何时,为什么?这是正常的,它从“姓氏”变为“名字”吗?我糊涂了。 (现在链接也失效了——该页面不在archive.org上) @JeromeJ 我已经更新了链接。警告是 resharper 所做的(用“zigzag”蓝色在代码下划线)。有关为什么上述属性有问题的更多信息 - 搜索 INotifyPropertyChanged 以及它通常如何实现的示例 如果您有多个具有此标记的方法,ReSharper 将在上下文菜单中列出它们,并让您选择要自动实现的方法。 (例如一种使用string 或一种使用Expression&lt;Func&lt;T&gt;&gt;

以上是关于实现 INotifyPropertyChanged 时,C# 中的 [NotifyPropertyChangedInvocator] 是啥?的主要内容,如果未能解决你的问题,请参考以下文章

为啥绑定更新没有实现 INotifyPropertyChanged?

观察者模式实现INotifyPropertyChanged

如何优雅的实现INotifyPropertyChanged接口

在实现 INotifyPropertyChanged 时,[CallerMemberName] 与替代方案相比是不是慢?

在实现 INotifyPropertyChanged 时,[CallerMemberName] 与替代方案相比是不是慢?

在 MVVM 中,ViewModel 或 Model 是不是应该实现 INotifyPropertyChanged?