【问题标题】:Use reflection to get actual value of the property notified by INotifyPropertyChanged?使用反射获取 INotifyPropertyChanged 通知的属性的实际值?
【发布时间】:2013-12-25 07:22:46
【问题描述】:

我正在开展一个项目,该项目将使用 INotifyPropertyChanged 来宣布订阅者类的属性更改。

void item_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        if (e.PropertyName == "Quantity")
....

在我看来,当订阅类收到通知时,它可以获得的唯一可用值是属性的名称。有没有办法获取具有属性更改的实际对象的引用?然后我可以从引用中获取这个属性的新值。也许使用反射?

有人介意写一个代码 sn-p 来帮助我吗?非常感谢。

【问题讨论】:

  • sender 可能就是那个。
  • 为什么不简单地扩展 PropertyChangedEventArgs 来携带您感兴趣的值呢?您可以使扩展类通用。
  • @slugster:只有当订阅者知道自定义 PropertyChangedEventArgs 后代时,这才有意义。例如,绑定引擎不是这样的。

标签: c# reflection inotifypropertychanged


【解决方案1】:

实际对象是sender(至少应该是):

void item_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    var propertyValue = sender.GetType().GetProperty(e.PropertyName).GetValue(sender);
}

如果您关心性能,请缓存 sender.GetType().GetProperty(e.PropertyName) 结果。

【讨论】:

    【解决方案2】:

    注意:这个接口主要是一个数据绑定API,数据绑定并不局限于反射等简单的模型。因此,我建议您使用 TypeDescriptor API。这将使您能够正确检测简单模型和复杂模型的变化:

    var prop = TypeDescriptor.GetProperties(sender)[e.PropertyName];
    if(prop != null) {
        object val = prop.GetValue(sender);
        //...
    }
    

    (带有using System.ComponentModel; 指令)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多