gpt4 book ai didi

c# - 简单地在 C# 中比较两个对象的属性

转载 作者:太空狗 更新时间:2023-10-29 22:14:35 25 4
gpt4 key购买 nike

我有一个包含很多属性的类。浅拷贝足以完全复制对象。

我需要比较一个对象只是为了检查它是否包含与另一个对象完全相同的值。

我的想法:

第一个也是最明显的解决方案就是创建一个巨大的方法 block ,一个接一个地比较每个属性。

第二个是序列化每个对象并对文件进行哈希处理或对其执行某种 md5 校验和。 (这真的有用吗?)

第三种是对对象进行某种反射,这将使第一个选项自动化,但会增加复杂性。

速度并不是真正的问题。

我很想听听想法,或者我缺少做这样的事情的任何其他方法。

编辑:谢谢大家。我的解决方案(修改为现在对通用项目递归):

public static bool IsSame<T>(T objA, T objB)
{
var type = typeof(T);
var properties = type.GetProperties();
foreach (var pi in properties.Where(a => a.CanRead))
{
if (pi.Name == "Item")
{
var piCount = properties.FirstOrDefault(a => a.Name == "Count");
int count = -1;
if (piCount != null && piCount.PropertyType == typeof(System.Int32))
count = (int)piCount.GetValue(objA, null);
if (count > 0)
{
for (int i = 0; i < count; i++)
{
dynamic child1 = pi.GetValue(objA, new object[] { i });
dynamic child2 = pi.GetValue(objB, new object[] { i });
return IsSame(child1, child2);
}
}
}
else
{
var val1 = type.GetProperty(pi.Name).GetValue(objA, null);
var val2 = type.GetProperty(pi.Name).GetValue(objB, null);
if (val1 != val2 && (val1 == null || !val1.Equals(val2)))
return false;
}
}
return true;
}

最佳答案

大多数序列化程序旨在确保数据在序列化和反序列化期间保持其完整性,而不是产生一致的序列化格式。我会避免为此目的使用序列化。

您可以考虑实现 IEquatable ,让每个实例都能够将自己与相同类型的实例进行比较。或者一个类为你做比较,实现 IEqualityComparer .他们如何进行这种比较可能是一个接一个地比较属性的“大方法”,或者使用反射。

反射可以是实现您的目标的一种相当快速和简单的方法,但可能会导致问题(例如,如果有人向您的类型添加了一个不应包含在比较相等性中的属性),但显然反过来也是true(有人添加了一个应该检查相等性的属性,但不更新相等性比较)。您使用哪种方法通常应取决于团队对每种方法的适应程度以及将使用该类的上下文。

在您的情况下,我可能会建议使用基于反射的方法,因为您希望检查浅克隆操作的结果,因此所有属性都应该相等。

顺便说一句,我建议使用 MemberwiseClone创建克隆的方法,这将减少对此类严格测试的需求。

关于c# - 简单地在 C# 中比较两个对象的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8928280/

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