实现 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<Func<T>>
)以上是关于实现 INotifyPropertyChanged 时,C# 中的 [NotifyPropertyChangedInvocator] 是啥?的主要内容,如果未能解决你的问题,请参考以下文章
为啥绑定更新没有实现 INotifyPropertyChanged?
如何优雅的实现INotifyPropertyChanged接口
在实现 INotifyPropertyChanged 时,[CallerMemberName] 与替代方案相比是不是慢?
在实现 INotifyPropertyChanged 时,[CallerMemberName] 与替代方案相比是不是慢?