比较两个对象并找出差异

Nic*_*ahn 90 c# asp.net

比较两个对象并找出差异的最佳方法是什么?

Customer a = new Customer();
Customer b = new Customer();
Run Code Online (Sandbox Code Playgroud)

dee*_*ee1 192

一个灵活的解决方案:您可以使用反射来枚举所有属性并确定哪些属性相等,然后返回一些属性列表和两个不同的值.

这是一些代码的示例,它是您所要求的良好开端.它现在只查看Field值,但您可以添加任意数量的其他组件以通过反射进行检查.它是使用扩展方法实现的,因此您的所有对象都可以使用它.

使用

    SomeCustomClass a = new SomeCustomClass();
    SomeCustomClass b = new SomeCustomClass();
    a.x = 100;
    List<Variance> rt = a.DetailedCompare(b);
Run Code Online (Sandbox Code Playgroud)

我要比较的样本类

    class SomeCustomClass
    {
        public int x = 12;
        public int y = 13;
    }
Run Code Online (Sandbox Code Playgroud)

和肉和马铃薯

using System.Collections.Generic;
using System.Reflection;

static class extentions
{
    public static List<Variance> DetailedCompare<T>(this T val1, T val2)
    {
        List<Variance> variances = new List<Variance>();
        FieldInfo[] fi = val1.GetType().GetFields();
        foreach (FieldInfo f in fi)
        {
            Variance v = new Variance();
            v.Prop = f.Name;
            v.valA = f.GetValue(val1);
            v.valB = f.GetValue(val2);
            if (!v.valA.Equals(v.valB))
                variances.Add(v);

        }
        return variances;
    }


}
class Variance
{
    public string Prop { get; set; }
    public object valA { get; set; }
    public object valB { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

  • +1"肉和马铃薯" (85认同)
  • 代替如果(!v.valA.Equals(v.valB)),以防止NullException使用if(!等于(v.valA,v.valB)) (24认同)
  • 5年后,这完全是我想要的.我只需要切换到GetProperties,它就像一个魅力(为了我的需要) (6认同)
  • 如果.GetFields()没有返回您想要的所有内容(如私有字段),请查看以下帖子:http://stackoverflow.com/questions/1040803/whats-wrong-with-this-reflection-code-getfields-is-返回-一个空阵列 (5认同)
  • 我喜欢这个想法,但这里的代码不起作用.这是一个小提示,显示了几个修复:https://dotnetfiddle.net/FhzcrS (5认同)

Dar*_*rov 11

Equals方法和IEquatable<T>接口可以用来知道,如果两个对象是相等的,但他们不会让你知道对象之间的差异.您可以通过比较每个属性值来使用反射.

另一种方法可能包括将这些实例序列化为某种文本格式,并比较结果字符串(XML,JSON,...)内部的差异.

  • 我认为他不是在寻找平等测试,而是寻找两个对象不匹配的原因的集合. (2认同)