N秒ごとに更新されるPOCOがあります。私が抱えている問題は、最後の更新以降にすべてのプロパティが変更されたわけではないということです。
変更をログに記録できるように、最後の更新以降に変更されたプロパティを知る必要があります。以前の更新から POCO のコピーを保持し、毎回比較を実行してから、プロパティの変更ごとにイベントを発生させることで、これを行うことができます。
ここで使用できるより良い解決策はありますか?
N秒ごとに更新されるPOCOがあります。私が抱えている問題は、最後の更新以降にすべてのプロパティが変更されたわけではないということです。
変更をログに記録できるように、最後の更新以降に変更されたプロパティを知る必要があります。以前の更新から POCO のコピーを保持し、毎回比較を実行してから、プロパティの変更ごとにイベントを発生させることで、これを行うことができます。
ここで使用できるより良い解決策はありますか?
それが本当に POCO である場合は、いいえ、コピーを保持する必要があります。POCO に IsDirty フラグを追加する場合は、プロパティが変更されたときにフラグを設定できます。どのプロパティが変更されたかがわかるように、IsDirty フラグをビットフィールドにすることができます。
class POCO
{
[Flags]
enum POCOFieldsEnum
{
Property1 = 0x01;
Property2 = 0x02;
}
private String _Property1;
public String Property1
{
get { return _Property1; }
set
{
if (value.Equals(_Property1)) return;
_Property1 = value;
DirtyFlags |= POCOFieldsEnum.Property1;
}
}
private String _Property2;
public String Property2
{
get { return _Property2; }
set
{
if (value.Equals(_Property2)) return;
_Property2 = value;
DirtyFlags |= POCOFieldsEnum.Property2;
}
}
POCOFieldsEnum DirtyFlags { private set; public get; }
}
このようなオブジェクトのプロパティが変更されてから元の値に戻された場合、DirtyFlag は設定されたままになることに注意してください。この状況を回避したい場合は、プロパティ セッターで比較するために、プロパティの元の値 (またはそれらのハッシュ) を保存する必要があります。
http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspxこれは、データ バインディングに適した標準的な方法です。
更新を行うたびに各プロパティの状態を「古い」値として保存することは、前回と実際に異なる値を持つプロパティのみを検出したい場合に必要です。たとえば、プロパティが必要ない場合などです。前回の更新以降、5 から 3 から 7 に変更され、5 に戻りました。
この区別を気にせず、propertychanged を使用したくない場合は、セッターで true に設定した bool 値を各プロパティに与え、更新するたびにそれらを false に設定できます。
GetProperty/SetProperty メカニズムを作成できます。これらの関数をセッター/ゲッターで呼び出すと、実際のデータとそれに関するメタデータを内部で任意の方法で保存できます。ただし、これはもはや POCO ではありません。
さまざまなプロパティのハッシュを作成し、それをプロパティ自体として保存し、検証しながら再度比較します。
私の知る限り、クラスのプロパティの変更を追跡するために.NETに「組み込まれている」ものは何もありません。ただし、次のいずれかが機能するはずです。
1) 各プロパティのセッターに手動でコードを記述して、変更を追跡します。
2) 「古い」コピーと「更新された」インスタンスを比較するコードを書きます (元の投稿で述べたのと同じことです)。
3) AOP フレームワーク ( PostSharpなど) を使用して、各プロパティに何らかの更新通知を追加します。