シンプルにすることも複雑にすることもできます。それはあなたが投資したい仕事の量に依存します。アスペクト指向プログラミングを使用して、IL ウィーバーを介してPostSharpなどの IL コードにアスペクトを追加できます。または、プロパティの状態を処理する単純なクラスを作成できます。非常に単純であるため、前者のアプローチは、この方法で処理するプロパティが非常に多い場合にのみ有効です。
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);
さようなら、アロイス・クラウス