扩展中的CallerMemberName(INotifyPropertyChanged)

时间:2013-08-28 10:48:40

标签: c# wpf inotifypropertychanged

我目前正在为INotifiyPropertyChanged接口实现扩展,你可以这样读:

INotifyPropertyChanged - Event stays null

获取更多信息。

现在我想进一步扩展这个扩展,这样我就不需要声明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"); 

这怎么可能?

1 个答案:

答案 0 :(得分:2)

简单地说,它不可能。您需要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声明中获得实际的委托