我有两个相同类型的复杂(即具有string,int,double,List和其他自制数据类型的对象)对象.我想比较它们的内容,以确保它们是相同的.注意:该对象没有实现.Equals(我无法控制)并且没有实现IComparable.
是否有通用方法(反射?)来比较两个对象的内容?
谢谢!
Gre*_*zer 17
我创建了一个类来执行.NET Objects的深度比较.看到:
https://github.com/GregFinzer/Compare-Net-Objects
我的工作解决方案.!
private bool Compare(object obj1, object obj2)
{
if (obj1 == null || obj2 == null)
{
return false;
}
if (!obj1.GetType().Equals(obj2.GetType()))
{
return false;
}
Type type = obj1.GetType();
if (type.IsPrimitive || typeof(string).Equals(type))
{
return obj1.Equals(obj2);
}
if (type.IsArray)
{
Array first = obj1 as Array;
Array second = obj2 as Array;
var en = first.GetEnumerator();
int i = 0;
while (en.MoveNext())
{
if (!Compare(en.Current, second.GetValue(i)))
return false;
i++;
}
}
else
{
foreach (PropertyInfo pi in type.GetProperties(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public))
{
var val = pi.GetValue(obj1);
var tval = pi.GetValue(obj2);
if (!Compare(val, tval))
return false;
}
foreach (FieldInfo fi in type.GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public))
{
var val = fi.GetValue(obj1);
var tval = fi.GetValue(obj2);
if (!Compare(val, tval))
return false;
}
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你.!
反射就是这样,但问题是包含的类型 - 例如,您不能只使用Equals
or ,因为如果它是 a等,EqualityComparer<T>
子数据也无法方便地进行比较。List<T>
您需要多久执行一次此操作?你能将它们序列化并比较序列化值吗?这可能是最稳健的选择。
有没有通用的方法来比较两个对象的内容?
是的,但通常这被称为 IComparable 接口。
如果您可以从该类继承并创建一个实现 IComparable 的子类,那可能是理想的选择。