c# - 观察另一个类的属性变化
问题描述
我想观察一个没有实现的类的属性 INotifyPropertyChanged
。
有没有办法做到这一点?如果我可以创建一些通用类或基类来继承并使用它,那就太好了。
解决方案
如果您无法更改需要事件的类,则可以使用此包装器:
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
推荐阅读
- php - 从两个表创建树结构
- swift - Swift - 颜色在设备上出现水洗
- android - ndk-build 没有制定目标的规则
- python - 使用 python zeep 使用 web 服务。如何处理这种响应?
- node.js - AWS S3 按名称查找文件
- github - 如何在 github-action 中缓存 docker-compose build
- javascript - 用 2 个值计算 3 个不同的金额
- salesforce - 如何将相关记录添加到闪电页面布局
- node.js - 与键关联的 Firebase 实时数据库访问值
- css - 使用 webpack 4 处理 font-awesome 的问题 - React JS