我在比较两个对象时遇到了问题。我正在努力找到两个对象之间的区别。它给我总是相同的结果。
这是我的目标:
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;
}
但字典值改变了我无法弄明白。它给我在源和目标对象中的修改值有什么帮助吗?
答案 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接口。
答案 2 :(得分:0)
你实际上是在尝试比较两个等于对象。 声明:
var objNewA = obj;
表示“为objNewA分配obj的引用”,因此对obj的任何更改都将出现在objNewA中。 如果您想“克隆”对象实例,您的ClassA必须实现ICloneable接口,并在您想要的对象上调用 Clone()方法克隆。
最后,由于您要比较两个自定义类,因此必须实现 IEquatable 界面才能使用 Equals()。 实施后,你可以做到
originalObject.Equals(changedObject);
为了实现你的目标