【问题标题】:How can I determine if a property in an object has changed如何确定对象中的属性是否已更改
【发布时间】:2014-01-08 08:19:42
【问题描述】:

我的应用程序中有许多具有大量属性的对象。这些对象代表数据库行(轻量级 ORM)。我想知道是否有任何方法可以确定对象中的属性是否已更改。例如,我意识到我“可以”这样做......

// Property for showing us whether a value in this object has changed
private bool _HasChanged = false;
public bool HasChanged
{
    get
    {
        return _HasChanged;
    }
    private set
    {
        _HasChanged = value;
    }
}


// My list of properties
private string _FirstName;
public string FirstName
{
    get
    {
        return _FirstName;
    }
    set
    {
        _HasChanged = true;
        _FirstName = value;
    }
}

private string _LastName;
public string LastName 
{
    get
    {
        return _LastName;
    }
    set
    {
        _HasChanged = true;
        _LastName = value;
    }
}

private int _Age;
public int Age 
{
    get
    {
        return _Age;
    }
    set
    {
        _HasChanged = true;
        _Age = value;
    }
}

但是如果我使用上面的例子,这意味着每个对象都有很多代码(有些对象最多有 40 个属性,而我有大约 30 个不同的对象)。我想做的是更像这样的事情......

// Property for showing us whether a value in this object has changed
private bool _HasChanged = false;
public bool HasChanged
{
    get
    {
        return _HasChanged;
    }
    private set
    {
        _HasChanged = value;
    }
}


// My list of properties
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }

如果我能做到以上几点,并在对象中的任何属性发生变化时以某种方式全局设置我的 HasChanged,那真的会加快我的开发过程。

任何关于如何更好地做到这一点的想法或指示将不胜感激。这是在 C# 中使用 NET 4.0(尽管如果有帮助我可以使用 4.5!)

非常感谢,

【问题讨论】:

  • 好吧,用你的代码,如果你将一个属性的值设置为它已经拥有的值,HasChanged 将是真的......这是假的;)
  • 看,这实际上是一个好点! :)

标签: c# .net


【解决方案1】:

幸运的是,您不需要重新发明轮子,因为有一种名为 INotifyPropertyChanged 的东西可以满足您的需求。它易于设置和使用,并且可以节省大量时间。看看这个教程如何实现它:

http://csharp.2000things.com/tag/inotifypropertychanged/

【讨论】:

  • 大约一个月前我对该主题的初步研究,提出了一些关于使用 iNotifyPropertyChanged 的​​负面信息,但我不记得这些负面信息是什么。
  • 当然,另一个问题是我仍然需要使用相当多的代码才能使用 iNotifyPropertyChanged 达到相同的结果。在您链接的教程中,我仍在编写相同数量的代码。我真的在寻找一种方法将其一次性应用到整个对象。
  • 一开始可能有点复杂,但最终它绝对是值得的。我经常使用它,主要用于 ORM 相关问题。到目前为止,我还没有找到更好的方法。
【解决方案2】:

实现指示属性更改的被动对象的常用方法是实现 INotifyPropertyChange 接口。

您完全正确,实施任何财产变更系统都是令人反感的。

但 ORM 通常可以生成预先实现了 INotifyPropertyChange 的对象。

否则,如果您接受付费,您可以购买商业版的 PostSharp。有了它,您只需使用 [NotifyPropertyChanged] 属性标记您的类,postsharp 将为您实现 INotifyPropertyChange。见www.postsharp.net。这是主页上的第一个示例。

您也可以使用开源的https://github.com/Fody 程序来执行此操作。

Roslyn CTP(未来的 Microsoft C#/VB.NET 编译器)包含一个用于此目的的机制。请参阅:Can I use Roslyn for compile time code rewriting? 回复。

【讨论】:

    猜你喜欢
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    相关资源
    最近更新 更多