我正在比较两个相同类型的对象,并将差异返回到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属性)
答案 0 :(得分:2)
您可以创建方法attribute
,例如名为ComparableAttribute
。
然后,您可以使用此属性修饰这些对象中的所有方法。
您可以在进行比较的方法中使用反射,并遍历所有Comparable
属性。代码会更短(一次迭代,而不是20 if
语句)。
如果您需要某些属性的自定义信息,可以通过ComparableAttribute
属性将其指定为参数。
比较方法仍然会将两个实例作为参数,但最终会得到一个小得多的实现。您甚至可以为您的类型缓存PropertyInfo
,因此您不会反映每次比较。
答案 1 :(得分:0)
为什么不反思结构:
existingProject
并比较所有字段。通过这种方式编写代码,您可以在问题中添加相当多的信息,例如StatusID和StatusName之间的关联,但如果您选择一些正确的命名约定,则可能会使整个事件自动化。
答案 2 :(得分:0)