我目前正在为INotifiyPropertyChanged接口实现一个扩展,您可以阅读以下内容:
INotifyPropertyChanged - Event stays null
以获取更多的信息。
现在,我想进一步扩展这个扩展,这样我就不需要声明MemberExpression,并且在从CallerMemberName属性执行其他操作的集合中调用它时。
因此,我尝试执行以下操作(基于上一个堆栈溢出问题中提供的链接):
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.PropertyChanged.Notify(); //with CallerMemberName
this.PropertyChanged.Notify("RandomProperty"); 这怎麽可能?
发布于 2013-08-28 10:56:01
很简单,这是不可能的。你需要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声明中获得实际的委托。
https://stackoverflow.com/questions/18485811
复制相似问题