如何确定对象中的属性是否已更改

时间:2014-01-08 08:19:42

标签: c# .net

我的应用程序中有许多具有大量属性的对象。这些对象表示数据库行(轻量级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,只要对象中的任何属性发生更改,它就会真正加快我的开发过程。

任何关于如何做得更好的想法或指示都将不胜感激。这是在使用.NET 4.0的C#中(虽然如果有帮助我可以使用4.5!)

非常感谢,

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

实现指示属性更改的被动对象的常用方法是实现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?回复。