Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何确定对象中的属性是否已更改_C#_.net - Fatal编程技术网

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

C# 如何确定对象中的属性是否已更改,c#,.net,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;

我的应用程序中有许多对象具有大量属性。这些对象表示数据库行(轻量级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;
    }
}
// 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; }
但是如果我使用上面的例子,这意味着每个对象都有很多代码(有些对象最多有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
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;
    }
}
// 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#中使用NET4.0(尽管如果有帮助的话,我可以使用4.5!)


非常感谢,

幸运的是,您不需要重新发明轮子,因为有一种叫做
INotifyPropertyChanged
的东西正是您所需要的。它易于设置和使用,节省了大量时间。请阅读本教程,了解如何实现它:


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

您完全正确地认识到,实现任何属性更改系统都是重新创建的

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

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

您也可以使用开源程序来实现这一点


Roslyn CTP(futur Microsoft C#/VB.NET编译器)包含了一种实现这一点的机制。请参阅:response。

好的,使用您的代码,如果您将属性的值设置为它已经具有的值,HasChanged将为true。。。这是错误的;)看,这实际上是一个很好的观点!:)大约一个月前,我对这个主题的初步研究提出了一些关于使用iNotifyPropertyChanged的负面影响,但我不记得这些负面影响是什么。当然,另一个问题是,我仍然需要使用大量代码才能使用iNotifyPropertyChanged获得相同的结果。在您链接的教程中,我仍在编写相同数量的代码。我真的在寻找一种方法,一次就把它应用到整个物体上。一开始它可能看起来有点复杂,但最后它肯定是值得的。我经常使用它,主要用于ORM相关的问题。到目前为止,我还没有找到更好的方法。