クラスの個々のプロパティをダーティとしてマークしたいと考えています。
ここで、クラス全体をダーティとしてマークする方法に出くわしました。これは次のように簡略化できます。
class DirtyClass
{
private string bar;
private int foo;
public string Bar
{
get { return bar; }
set { SetProperty(ref bar, value); }
}
public int Foo
{
get { return foo; }
set { SetProperty(ref foo, value); }
}
public bool IsDirty { get; private set; }
protected void SetProperty<T>(ref T field, T value)
{
if (!EqualityComparer<T>.Default.Equals(field, value))
{
field = value;
IsDirty = true;
}
}
}
DirtyProperty クラスを作成するためのガイドとしてこのコードを使用しようとしました
class DirtyProperty<T> where T : class
{
private bool isDirty = true;
private T property;
public bool GetIsDirty()
{
bool b = isDirty;
// Reset dirty flag
isDirty = false;
return b;
}
public T GetValue()
{
return property;
}
public void SetValue(ref T value)
{
if (!EqualityComparer<T>.Default.Equals(property, value))
{
property = value;
isDirty = true;
}
}
}
ダーティ フラグは、フレームごとに 1 回だけ呼び出され、DirtyProperty クラスを保持するクラス以外のクラスからは呼び出されないため、GetIsDirty メソッドで false としてマークされます。関数への複数の呼び出しを処理するために isDirty を false としてマークするより良い方法はありますか?
問題は、非参照型 (int など) を使用すると、このアプローチが失敗することです。
class ClassWithDirtyProperties
{
public DirtyProperty<string> Bar;
public DirtyProperty<int> Foo;
}
どうすればアプローチを改善し、この問題を解決できますか?
上記のクラスをどのように使用したいかの例
var c = new ClassWithDirtyProperties();
c.Foo.SetValue(21);
……
if (c.Foo.GetIsDirty())
{
// Update parameter
SetParameter(c.Foo.GetValue());
}