2

我正在比较相同类型的两个对象并将差异返回到FieldChange对象列表中。现在我列出了每个字段比较,这似乎有点不理想。

有没有更简洁的方法来重构下面的代码以避免重复?下面有两组代码,但实际上我有大约 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属性。代码会短得多(一次迭代,而不是 20 条if语句)。

如果您需要某些属性的自定义信息,您可以通过ComparableAttribute属性将其指定为参数。

compare 方法仍将两个实例作为参数,但您最终会得到一个更小的实现。您甚至可以PropertyInfo为您的类型缓存 s,这样您就不会在每次比较时进行反映。

于 2012-07-08T16:53:51.680 回答
0

为什么不反映到结构中:

existingProject

并比较所有领域。通过以这种方式长期编写代码,您为问题添加了大量信息,例如 StatusID 和 StatusName 之间的关联,但是如果您选择一些适当的命名约定,您可能会自动完成整个事情。

于 2012-07-08T16:55:31.387 回答
0

为什么不使用 INotifyPropertyChanged接口?在这里查看有关它的信息。您只需实现它并订阅该事件。还有一个链接

于 2012-07-08T17:01:42.250 回答