【问题标题】: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],这样做有什么好处?我在互联网上搜索过,但找不到任何好的答案。

【问题讨论】:

    标签: c# wpf windows-phone-8 windows-8.1 c#-5.0


    【解决方案1】:

    NotifyPropertyChangedInvocatorResharper 功能。

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

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

    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;
    猜你喜欢
    • 1970-01-01
    • 2010-12-28
    • 2015-09-29
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-05
    • 1970-01-01
    相关资源
    最近更新 更多