我的应用程序中有许多具有大量属性的对象。这些对象表示数据库行(轻量级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!)
非常感谢,
答案 0 :(得分:3)
幸运的是,您不需要重新发明轮子,因为有一种名为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?回复。