首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扩展中的CallerMemberName (INotifyPropertyChanged)

扩展中的CallerMemberName (INotifyPropertyChanged)
EN

Stack Overflow用户
提问于 2013-08-28 10:48:40
回答 1查看 1.7K关注 0票数 0

我目前正在为INotifiyPropertyChanged接口实现一个扩展,您可以阅读以下内容:

INotifyPropertyChanged - Event stays null

以获取更多的信息。

现在,我想进一步扩展这个扩展,这样我就不需要声明MemberExpression,并且在从CallerMemberName属性执行其他操作的集合中调用它时。

因此,我尝试执行以下操作(基于上一个堆栈溢出问题中提供的链接):

代码语言:javascript
复制
public static void Notify(this PropertyChangedEventHandler EventHandler, object sender, 
[CallerMemberName] String propertyName = "")
{
    if (EventHandler != null)
    {
        EventHandler(sender, new PropertyChangedEventArgs(propertyName));
    }
}

这使我可以像这样调用该方法:

代码语言:javascript
复制
this.PropertyChanged.Notify(this); //with CallerMemberName
this.PropertyChanged.Notify(this, "RandomProperty"); 

现在,我想删除始终编写(这个,.)的必要性。参数,并按如下方式调用它:

代码语言:javascript
复制
this.PropertyChanged.Notify(); //with CallerMemberName
this.PropertyChanged.Notify("RandomProperty"); 

这怎麽可能?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-28 10:56:01

很简单,这是不可能的。你需要3条信息:

  • 事件处理程序实例(this.PropertyChanged,位于左侧)
  • 事件名称(propertyName,由编译器提供)
  • 发送者(sender)

不能从任何其他信息推断sender,也没有编译器选项来提供它。但是,坦率地说,我只需要使用一个实例方法来代替:

代码语言:javascript
复制
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
    var handler = PropertyChanged;
    if(handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}

然后调用者简单地发出:

代码语言:javascript
复制
OnPropertyChanged(); // job done

当然,您可以让OnPropertyChanged调用您的静态方法,但这似乎没有必要。

在某种程度上,我们应该能够传递INotifyPropertyChanged实例来同时用于sender和访问PropertyChanged,但是我们当然不能从event声明中获得实际的委托。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18485811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档