比较两个对象并找出差异

时间:2011-02-09 22:21:10

标签: c# asp.net

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

Customer a = new Customer();
Customer b = new Customer();

2 个答案:

答案 0 :(得分:183)

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

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

使用

    SomeCustomClass a = new SomeCustomClass();
    SomeCustomClass b = new SomeCustomClass();
    a.x = 100;
    List<Variance> rt = a.DetailedCompare(b);

我要比较的样本类

    class SomeCustomClass
    {
        public int x = 12;
        public int y = 13;
    }

和肉和马铃薯

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; }
}

答案 1 :(得分:11)

可以使用Equals方法和IEquatable<T>接口来了解两个对象是否相等,但它们不允许您知道对象之间的差异。您可以通过比较每个属性值来使用反射。

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