首页 > 解决方案 > 观察另一个类的属性变化

问题描述

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

有没有办法做到这一点?如果我可以创建一些通用类或基类来继承并使用它,那就太好了。

标签: c#.net

解决方案


如果您无法更改需要事件的类,则可以使用此包装器:

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


推荐阅读