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