隐式检测对象的属性更改

时间:2017-08-09 15:08:44

标签: c#

我正在尝试实现一个非常简单且更重要的可选对象跟踪系统,类似于实体框架跟踪对象更改的方式(How change tracking works in Entity Framework)。

我有一个所有其他对象都继承自的基类。该类有一个名为modified的布尔字段。对此的显式解决方案是更新其他类的所有属性上的每个setter,以便在触发setter时设置modified = true。此解决方案已在此处详细介绍Create an event to watch for a change of variable

我想要一个更隐含的解决方案。我有很多对象和很多属性。更新setter是非常混乱的。我不想直接模仿实体框架如何做事情,因为它对我目前的要求来说太贵了。我想要一个可以循环检查modified == true的对象列表。这允许我可选地跟踪对象并快速检查它们是否已更改,而不必触发每个单独对象的更新。有没有办法可以隐式地在所有属性getter和setter上设置某种监听器?

我知道这段代码不存在,但是.NET有办法监视对象以查看它是否已经改变。

[OnChange=ObjectChanged()] //maybe this way
public class MyClass
{
    bool modified {get; set;}
    public MyClass() : OnChange(ObjectChanged) //or this way
    {

    }

    private void ObjectChanged()
    {
        modified = true;
    }
}

正如我所提到的,我不想更新每个setter或复制实体框架。

1 个答案:

答案 0 :(得分:3)

.NET框架中没有内置任何内容,但是有第三方工具可以做到这一点。

一个这样的选项是Fody/PropertyChanged,它会将OnPropertyChanged个调用注入到类的所有自动属性设置器中。您可以订阅PropertyChanged事件并更新布尔标志。作为额外的奖励,(a)您将获得已更改的属性的名称,以及(b)其他类(例如您的UI框架)也可以订阅该事件。