Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 比较两个对象并找出差异_C#_Asp.net - Fatal编程技术网

C# 比较两个对象并找出差异

C# 比较两个对象并找出差异,c#,asp.net,C#,Asp.net,比较两个对象并找出差异的最佳方法是什么 Customer a = new Customer(); Customer b = new Customer(); 一个灵活的解决方案:您可以使用反射枚举所有属性,并确定哪些是相等的,哪些不是相等的,然后返回一些属性列表和两个不同的值 下面是一些代码的示例,它是您所问问题的良好开端。它现在只查看字段值,但您可以添加任意数量的其他组件,以便它通过反射进行检查。它是使用扩展方法实现的,因此所有对象都可以使用它 使用 SomeCustomClass a

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

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

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

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

使用

    SomeCustomClass a = new SomeCustomClass();
    SomeCustomClass b = new SomeCustomClass();
    a.x = 100;
    List<Variance> rt = a.DetailedCompare(b);
还有肉和土豆

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; }
}
使用System.Collections.Generic;
运用系统反思;
静态类扩展
{
公共静态列表DetailedCompare(此T值1,T值2)
{
列表差异=新列表();
FieldInfo[]fi=val1.GetType().GetFields();
foreach(fi中的字段信息f)
{
方差v=新方差();
v、 Prop=f.名称;
v、 valA=f.GetValue(val1);
v、 valB=f.GetValue(val2);
如果(!v.valA.等于(v.valB))
差异。添加(v);
}
回报差异;
}
}
阶级差异
{
公共字符串属性{get;set;}
公共对象valA{get;set;}
公共对象valB{get;set;}
}
该方法和接口可用于了解两个对象是否相等,但它们不允许您了解对象之间的差异。您可以通过比较每个属性值来使用反射


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

我认为他不是在寻找相等性测试,而是寻找两个对象不匹配的原因集合。当然,但这并没有真正意义,因为我们不知道客户中包含了什么class@deepee1,@Rob,我同意
等于
IEquatable
不允许找出差异。在这种情况下可以使用反射。使用if(!Equals(v.valA,v.valB))代替if(!v.valA.Equals(v.valB))来防止NullException为什么不使用自动属性?如果.GetFields()不能返回您想要的所有内容(如私有字段),请查看此帖子:5年后,这完全是我想要的。我只需要切换到GetProperties,它就像一个符咒(满足我的需要)一样工作。我喜欢这个想法,但这里的代码不起作用。这里有一把小提琴,它展示了一些修复方法:
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; }
}