扩展中的CallerMemberName(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 ,在左侧)
  • event-name( 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声明中获取实际的委托