gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:19:51 30 4
gpt4 key购买 nike

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

最佳答案

您可以创建一个方法 attribute ,例如称为 ComparableAttribute。然后你可以用这个属性来装饰这些对象中的所有方法。

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

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

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

关于c# - 有没有办法让这个 C# 比较代码更通用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11384865/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com