你可以让它变得简单或复杂。这取决于你想投入多少工作。您可以使用面向方面的编程,通过 IL 编织器将方面添加到 IL 代码中,例如PostSharp。或者您可以创建一个简单的类来处理您的财产的状态。前一种方法非常简单,只有在您有很多属性要以这种方式处理时才会奏效。
using System;
class Dirty<T>
{
T _Value;
bool _IsDirty;
public T Value
{
get { return _Value; }
set
{
_IsDirty = true;
_Value = value;
}
}
public bool IsDirty
{
get { return _IsDirty; }
}
public Dirty(T initValue)
{
_Value = initValue;
}
}
class Program
{
static Dirty<int> _Integer;
static int Integer
{
get { return _Integer.Value; }
set { _Integer.Value = value; }
}
static void Main(string[] args)
{
_Integer = new Dirty<int>(10);
Console.WriteLine("Dirty: {0}, value: {1}", _Integer.IsDirty, Integer);
Integer = 15;
Console.WriteLine("Dirty: {0}, value: {1}", _Integer.IsDirty, Integer);
}
}
另一种可能性是使用在运行时生成的代理类,它会为您添加方面。对于 .NET 4,有一个类已经为您处理了这方面的问题。它称为ExpandObject,它会在属性更改时通过事件通知您。好处是 ExpandoObject 允许您在运行时定义任意数量的属性,并且您会收到有关属性每次更改的通知。这种类型的 WPF 数据绑定非常容易。
dynamic _DynInteger = new ExpandoObject();
_DynInteger.Integer = 10;
((INotifyPropertyChanged)_DynInteger).PropertyChanged += (o, e) =>
{
Console.WriteLine("Property {0} changed", e.PropertyName);
};
Console.WriteLine("value: {0}", _DynInteger.Integer );
_DynInteger.Integer = 20;
Console.WriteLine("value: {0}", _DynInteger.Integer);
你的,阿洛伊斯克劳斯