你可以简单或复杂地实现它。这取决于你想要投入多少工作。你可以使用面向方面的编程通过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);
您好,Alois Kraus