C#:检查两个对象是否具有相同的数据

C#:检查两个对象是否具有相同的数据,c#,.net,C#,.net,假设Obj1和Obj2是同一类的对象,并且该类仅包含字段,如果该类的字段未知,是否可以检查这两个对象是否具有相同的数据 var haveSameData = false; foreach(PropertyInfo prop in Obj1.GetType().GetProperties()) { haveSameData = prop.GetValue(Obj1, null).Equals(prop.GetValue(Obj2, null)); if(!haveSameDat

假设
Obj1
Obj2
是同一类的对象,并且该类仅包含字段,如果该类的字段未知,是否可以检查这两个对象是否具有相同的数据

var haveSameData = false;

foreach(PropertyInfo prop in Obj1.GetType().GetProperties())
{
    haveSameData = prop.GetValue(Obj1, null).Equals(prop.GetValue(Obj2, null));

    if(!haveSameData)
       break;
}
这是基于假设(对象属于同一类型),并且可能会进行重构,以使其更具防御性, 但我会让它可读,这样你就能理解我想做什么

简而言之,使用反射在字段上迭代并检查每个字段的值,直到它们不匹配为止(此后无需继续迭代)。

尝试以下断言:

CollectionAssert.AreEqual(Obj1, Obj2);

很确定,如果不知道字段的名称,这是不可能的。虽然有可能,但我可能错了。现在就写答案(提示,它涉及到反射)。是的,在示例中不需要大量使用typeof()函数的可能副本。除此之外,这是一个理由充分的直接样本。我还可以将“==”操作符替换为“.Equals()”以避免引用比较。干杯据此编辑。谢谢。“编码人”的一个练习可能是处理复杂的属性类型,如泛型列表。@RobEpstein:是的,我会再试一次:)问题说类只包含字段而不包含属性。困惑您的答案为什么被接受这很好,但它只比较实现
ICollection
的对象。这将使用内置的.net Equal方法,该方法将执行引用相等检查。