2

同じタイプの 2 つのオブジェクトを比較し、違いをFieldChangeオブジェクトのリストに返しています。現在、このように各フィールドの比較をリストしていますが、これは少し最適ではないようです。

繰り返しを避けるために、以下のコードをリファクタリングするよりクリーンな方法はありますか? 以下に 2 つのコード セットがありますが、実際には約 20 の比較があります。

var changes = new List<FieldChange>();
if (proposedUpdatedProject.StatusId != existingProject.StatusId)
{
    var previousStatusName = existingProject.StatusShortName;
    existingProject.Status = ProjectModel.Repository.Fetch<ProjectStatus>(proposedUpdatedProject.StatusId);
    changes.Add(new FieldChange { FieldName = "Status", PreviousValue = previousStatusName, NewValue = existingProject.StatusShortName });
}

if (proposedUpdatedProject.TechOwnerId != existingProject.TechOwnerId)
{
    var previousTechOwnerName = existingProject.TechOwnerName;
    existingProject.TechOwner = ProjectModel.Repository.Fetch<Person>(proposedUpdatedProject.TechOwnerId);
    changes.Add(new FieldChange { FieldName = "Tech Owner", PreviousValue = previousTechOwnerName, NewValue = existingProject.TechOwnerName });
}   

注: すべてのオブジェクトは、BaseObj と呼ばれる同じオブジェクトから派生していることに注意してください。また、同等のフィールドの値を FieldChange オブジェクトに入れるだけではないことに注意してください (id 対 Name プロパティ)。

4

3 に答える 3

2

attributeと呼ばれるメソッドを作成できますComparableAttribute。次に、これらのオブジェクトのすべてのメソッドをこの属性で装飾できます。

比較を行っているメソッドでリフレクションを使用し、すべてのComparableプロパティを反復処理できます。コードははるかに短くなります (20ifステートメントではなく 1 回の反復)。

特定のプロパティのカスタム情報が必要な場合は、ComparableAttribute属性を介してパラメータとして指定できます。

比較メソッドは依然としてパラメーターとして 2 つのインスタンスを受け取りますが、実装ははるかに小さくなります。タイプの をキャッシュすることもできるPropertyInfoので、各比較で反映しません。

于 2012-07-08T16:53:51.680 に答える
0

構造に反映しない理由:

existingProject

そして、すべてのフィールドを比較します。このようにコードを長文で書くと、StatusID と StatusName の関連付けなど、かなりの量の情報が問題に追加されますが、適切な命名規則を選択すれば、すべてを自動化できる可能性があります。

于 2012-07-08T16:55:31.387 に答える
0

INotifyPropertyChangedインターフェイスを使用しないのはなぜ ですか? それについての情報はこちらをご覧ください。それを実装し、イベントをサブスクライブするだけです。もう1つのリンク

于 2012-07-08T17:01:42.250 に答える