![](/img/trans.png)
[英]Is [CallerMemberName] slow compared to alternatives when implementing INotifyPropertyChanged?
[英]CallerMemberName in an extension (INotifyPropertyChanged)
我目前正在为INotifiyPropertyChanged接口实现扩展,你可以这样读:
INotifyPropertyChanged - 事件保持为空
了解更多信息。
现在我想进一步扩展这个扩展,这样我就不需要声明MemberExpression了,当从一个集合中调用它时,CallerMemberName属性完成剩下的工作。
所以我尝试执行以下操作(基于我上一次stackoverflow问题中提供的链接):
public static void Notify(this PropertyChangedEventHandler EventHandler, object sender,
[CallerMemberName] String propertyName = "")
{
if (EventHandler != null)
{
EventHandler(sender, new PropertyChangedEventArgs(propertyName));
}
}
这允许我调用这样的方法:
this.PropertyChanged.Notify(this); //with CallerMemberName
this.PropertyChanged.Notify(this, "RandomProperty");
现在我想删除总是写入(this,..)参数的必要性,并像这样调用它:
this.PropertyChanged.Notify(); //with CallerMemberName
this.PropertyChanged.Notify("RandomProperty");
这怎么可能?
简单地说,这是不可能的。 您需要3条信息:
this.PropertyChanged
,在左侧) propertyName
,由编译器提供) sender
) 无法从任何其他信息推断sender
,并且没有提供它的编译器选项。 但是,坦率地说,我只想使用实例方法:
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
var handler = PropertyChanged;
if(handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
然后调用者只发出:
OnPropertyChanged(); // job done
你当然可以让OnPropertyChanged
调用你的静态方法,但这似乎是不必要的。
在某些方面, 感觉我们应该只能传入INotifyPropertyChanged
实例以用于sender
和访问PropertyChanged
,但当然我们无法从event
声明中获取实际的委托 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.