【问题标题】:Implicitly detect a property change of an object隐式检测对象的属性变化
【发布时间】:2017-08-09 15:08:43
【问题描述】:

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

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

我想要一个更隐含的解决方案。我有很多对象和很多属性。更新设置器非常混乱。我不想直接模仿实体框架是如何做事的,因为它对我目前的要求来说太贵了。我想要一个可以循环检查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 或复制实体框架的功能。

【问题讨论】:

  • @Adam 请先阅读该问题,然后再根据标题暗示它是重复的。
  • @DanHastings 或者,也许阅读 answers 不仅仅是问题,以确定它是否与您的问题足够接近,从而为您指明正确的方向。重复并不意味着问题相同 - 也可能是答案相同
  • @Jamiec:An applicable answer from a different question does not automatically make the question a duplicate. 请不要忘记,SO 的主要目的不仅是帮助 OP,而且是建立一个易于查找的问题和答案的存储库。
  • @Heinzi 并非总是如此,但它很好地表明如果正在谈论诸如“确定属性是否已更改”这样的通用内容,它可能是重复的

标签: c#


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-21
    • 2019-06-09
    • 2017-08-18
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    相关资源
    最近更新 更多