比较c#.net中的对象有一些困难

时间:2013-11-24 14:14:01

标签: c# asp.net c#-4.0 c#-3.0

我在比较两个对象时遇到了问题。我正在努力找到两个对象之间的区别。它给我总是相同的结果。

这是我的目标:

ClassA
{
    int slNo;
    string location;
    Dictionary dic = new Dictionary<string,Object>();
    ClassB classb = new ClassB();
}

ClassB
{
    int id;
    string name;
}

我为classA创建了一个实例并分配了一些值。

ClassA obj = new ClassA{ dic = new Dictionary<string, object>, classb = new ClassB()};

并用一些值填充obj。

将值复制到新对象

var objNewA = obj;

并更改了classA,如下所示。更改了obj.slNo = 100的值,并且还更改了一些dic值集合。我可以使用以下方法找到slno的区别

 public static bool FindDifference(ClassA originalObject, ClassA changedObject)
 {
     foreach (PropertyInfo property in originalObject.GetType().GetProperties())
     {
         object originalValue = property.GetValue(originalObject, null);
         object newValue = property.GetValue(changedObject, null);

         if (!Equals(originalValue, newValue))
         {
              return true;
         }
     }
     return false;
 }

但字典值改变了我无法弄明白。它给我在源和目标对象中的修改值有什么帮助吗?

3 个答案:

答案 0 :(得分:1)

编写var objNewA = obj;不会复制原始对象的值,只是获得相同的引用。然后,您有2个变量访问内存中的同一个对象,修改obj也适用于objNewA。你永远不会发现它们之间有任何区别。

你可以做的就是克隆你的对象,就像在SO question中一样。您将获得两个具有两个不同引用的对象,但属性值将相同。

关于检查dict,我不认为Reflection是最好的方法,因为它很快就会变得难以编写和维护。此外,您的参数属于ClassA类型,您已经可以访问自己的属性,而无Reflection

如果您需要更多关于比较两个ClassA对象的一般行为,那么在您的类定义中覆盖object.Equals会怎么样?您正在返回boolean,这意味着您只需检查检查值是否等于。例如,您可以在ClassA

中添加此内容
public override bool Equals(Object obj)
{
    if (obj == null || !(obj is ClassA))
       return false;
    else
    {
        ClassA other = (ClassA)obj;
        bool isEqual = // ... do all the checks you need, like comparing this.dict with other.dict
        return isEqual;
    }
}

答案 1 :(得分:0)

比较两个对象时,请实现IComparable接口。

How to Implement IComparable interface?

答案 2 :(得分:0)

你实际上是在尝试比较两个等于对象。 声明:

var objNewA = obj;

表示“为objNewA分配obj的引用”,因此对obj的任何更改都将出现在objNewA中。 如果您想“克隆”对象实例,您的ClassA必须实现ICloneable接口,并在您想要的对象上调用 Clone()方法克隆。

最后,由于您要比较两个自定义类,因此必须实现 IEquatable 界面才能使用 Equals()。 实施后,你可以做到

originalObject.Equals(changedObject);

为了实现你的目标