Вы можете сделать это простым или сложным.Это зависит от того, сколько работы вы хотите инвестировать.Вы можете использовать аспектно-ориентированное программирование для добавления аспекта с помощью ткача 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);
С уважением, Алоис Краус