0

我目前正在为 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"); 

这怎么可能?

4

1 回答 1

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

于 2013-08-28T10:56:01.333 回答