有没有办法让这个C#比较代码更通用?

时间:2012-07-08 16:47:10

标签: c# refactoring

我正在比较两个相同类型的对象,并将差异返回到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属性)

3 个答案:

答案 0 :(得分:2)

您可以创建方法attribute,例如名为ComparableAttribute。 然后,您可以使用此属性修饰这些对象中的所有方法。

您可以在进行比较的方法中使用反射,并遍历所有Comparable属性。代码会更短(一次迭代,而不是20 if语句)。

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

比较方法仍然会将两个实例作为参数,但最终会得到一个小得多的实现。您甚至可以为您的类型缓存PropertyInfo,因此您不会反映每次比较。

答案 1 :(得分:0)

为什么不反思结构:

existingProject

并比较所有字段。通过这种方式编写代码,您可以在问题中添加相当多的信息,例如StatusID和StatusName之间的关联,但如果您选择一些正确的命名约定,则可能会使整个事件自动化。

答案 2 :(得分:0)

为什么不使用INotifyPropertyChanged界面?查看here以获取相关信息。您只需实现它,并订阅该事件。还有一个link