【问题标题】:Observe a property change of another class观察另一个类的属性变化
【发布时间】:2021-04-09 07:00:56
【问题描述】:

我想观察一个没有实现INotifyPropertyChanged的类的属性。

有什么方法可以实现吗?如果我可以创建一些通用类或基类来继承并使用它,那就太好了。

【问题讨论】:

  • 为什么不能直接实现INotifyPropertyChanged?您是否只是在寻找better way 来实现它?
  • 当数据上下文未实现INotifyPropertyChanged 时,您可以尝试使用same approach 作为wpf 中的绑定。不过,您仍然需要在某个地方发出通知。
  • @Sinatr 事实上我并没有创建这些类,比如内置类,我不想要 WPF 我想要它在控制台或 DLL 中。
  • 你能说得更具体点吗?看起来像XY problem
  • 我相信对于此类任务,您只需要轮询值,这就是 Windows 任务管理器的工作方式。

标签: c# .net


【解决方案1】:

如果你不能改变你需要事件的类,你可以使用这个包装器:

public class NotifyPropertyChangedWrapper<T> : INotifyPropertyChanged
{
    private readonly T item;
    public event PropertyChangedEventHandler PropertyChanged;

    public NotifyPropertyChangedWrapper(T item)
    {
        this.item = item;
    }

    public TProp Get<TProp>(Expression<Func<T, TProp>> exp)
    {
        MemberExpression memExp = exp.Body as MemberExpression;
        var property = memExp.Member as PropertyInfo;
        return (TProp)property.GetValue(item);
    }

    public void Set<TProp>(Expression<Func<T, TProp>> exp, TProp newValue)
    {
        MemberExpression memExp = exp.Body as MemberExpression;
        var property = memExp.Member as PropertyInfo;
        property.SetValue(item, newValue);
        PropertyChanged?.Invoke(item, new PropertyChangedEventArgs(property.Name));
    }
}

如果你使用它,你只能通过包装器的 set 和 get 方法设置和获取属性。如果你这样做,NotifyPropertyChanged 事件将被调用。这是一个示例用法

class Test
{
    public int SomeProperty { get; set; }
}

var notify = new NotifyPropertyChangedWrapper<Test>(new Test());
notify.PropertyChanged += (s, e) => Console.WriteLine(e.PropertyName);
notify.Set(x => x.SomeProperty, 10);
Console.WriteLine(notify.Get(x => x.SomeProperty));

这是一个在线演示:https://dotnetfiddle.net/oVE4WW

【讨论】:

  • @sj13 请注意,与实际软件中应该使用的代码相比,它更多的是对 conecpt 的一些证明。例如,如果您使用任意表达式调用 Get 和 Set 方法,则会引发 NullReferenceException。此外,可以考虑仅在 newValue 与属性的当前值不同时才调用 PropertyChanged 事件等等。
猜你喜欢
  • 2016-04-11
  • 1970-01-01
  • 2011-05-27
  • 2017-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-24
  • 1970-01-01
相关资源
最近更新 更多