比较两个对象的内容是否相等

Mar*_*tin 12 c#

我有两个相同类型的复杂(即具有string,int,double,List和其他自制数据类型的对象)对象.我想比较它们的内容,以确保它们是相同的.注意:该对象没有实现.Equals(我无法控制)并且没有实现IComparable.

是否有通用方法(反射?)来比较两个对象的内容?

谢谢!

Gre*_*zer 17

我创建了一个类来执行.NET Objects的深度比较.看到:

https://github.com/GregFinzer/Compare-Net-Objects

  • @Jack我现在在GitHub上创建了几个Wiki页面。还有一个帮助文件:https://github.com/GregFinzer/Compare-Net-Objects/wiki (2认同)
  • 多年来我一直在使用它的修改版本,它很棒。我刚刚看到这个项目还活着,好新。例如,对于单元测试非常方便。谢谢格雷格。 (2认同)

Gok*_*l E 6

我的工作解决方案.!

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)

希望能帮助到你.!


Mar*_*ell 5

反射就是这样,但问题是包含的类型 - 例如,您不能只使用Equalsor ,因为如果它是 a等,EqualityComparer<T>子数据无法方便地进行比较。List<T>

您需要多久执行一次此操作?你能将它们序列化并比较序列化值吗?这可能是最稳健的选择。


Han*_*nto 3

有没有通用的方法来比较两个对象的内容?

是的,但通常这被称为 IComparable 接口。

如果您可以从该类继承并创建一个实现 IComparable 的子类,那可能是理想的选择。

  • 好吧,对于 *平等* 它将是 `Equals` 或 `IEquatable&lt;T&gt;`,而不是 `IComparable[&lt;T&gt;]` (8认同)