如何差异的两个版本同样的对象?
-
22-07-2019 - |
题
我想比较两种对象的不同版本,显示他们的分歧。
第一,我呼叫一个方法知道如果有任何差之间的两个对象
该方法是:
public bool AreEqual(object object1,object object2, Type comparisionType)
如果上述方法返回真的,我打电话 GetDifferences
法获得的差异,这是:
public ObjectDifference[] GetObjectDifferences(object object1, object object2, Type comparisionType)
{
ArrayList memberList = new ArrayList();
ArrayList differences = new ArrayList();
memberList.AddRange(comparisionType.GetProperties());
memberList.AddRange(comparisionType.GetFields());
for (int loopCount = 0; loopCount < memberList.Count; loopCount++)
{
object objVal1 = null;
object objVal2 = null;
MemberInfo member = ((MemberInfo)memberList[loopCount]);
switch (((MemberInfo)memberList[loopCount]).MemberType)
{
case MemberTypes.Field:
objVal1 = object1 != null ? ((FieldInfo)memberList[loopCount]).GetValue(object1) : null;
objVal2 = object2 != null ? ((FieldInfo)memberList[loopCount]).GetValue(object2) : null;
break;
case MemberTypes.Property:
objVal1 = object1 != null ? ((PropertyInfo)memberList[loopCount]).GetValue(object1, null) : null;
objVal2 = object2 != null ? ((PropertyInfo)memberList[loopCount]).GetValue(object2, null) : null;
break;
default:
break;
}
if (AreValuesDifferentForNull(objVal1, objVal2))
{
ObjectDifference obj = new ObjectDifference(objVal1, objVal2, member, member.Name);
differences.Add(obj);
}
else if (AreValuesDifferentForPrimitives(objVal1, objVal2))
{
ObjectDifference obj = new ObjectDifference(objVal1, objVal2, member, member.Name);
differences.Add(obj);
}
else if (AreValuesDifferentForList(objVal1, objVal2))
{
ObjectDifference[] listDifference = GetListDifferences((ICollection)objVal1, (ICollection)objVal2, member);
differences.AddRange(listDifference);
}
else if ((!AreValuesEqual(objVal1, objVal2)) && (objVal1 != null || objVal2 != null))
{
ObjectDifference obj = new ObjectDifference(objVal1, objVal2, member, member.Name);
differences.Add(obj);
}
}
return (ObjectDifference[])differences.ToArray(typeof(ObjectDifference));
}
public class ObjectDifference
{
private readonly object objectValue1;
private readonly object objectValue2;
private readonly System.Reflection.MemberInfo member;
private readonly string description;
public object ObjectValue1
{
get { return objectValue1; }
}
public object ObjectValue2
{
get { return objectValue2; }
}
public System.Reflection.MemberInfo Member
{
get { return member; }
}
public string Description
{
get { return description; }
}
public ObjectDifference(object objVal1, object objVal2, System.Reflection.MemberInfo member, string description)
{
this.objectValue1 = objVal1;
this.objectValue2 = objVal2;
this.member = member;
this.description = description;
}
}
对于每个区别是我创造的一个目的类型ObjectDifference并将它添加到阵列。高亮的部分是那个我卡住了!如果对象包含的另一个复杂的对象,我的节目不会给我的分歧,但我不知道是哪类型就是属于
例如,我有两种类型的对象的名字
class Name
{
string firstName, LastName;
List phNumber;
}
class PhoneNumber
{
string officeNo, MobileNo, HomeNo;
}
同时,比较两个对象出我所得到的是纯
firstname
-约翰*玛丽LastName
-库珀咯officeNo
- 22222 44444MobileNo
- 989898 089089HomeNo
- 4242 43535
层级结构, officeNo
的类型 PhoneNumber
失去,这是重要的,对我来显示。
我应该怎么保持这种类型的树在创建之间的差异?希望我能够让我的问题的理解。
解决方案
什么你想做的,显示本身就是复杂的。我已经做到了这一点在过去的(对于diffgram/三角洲进程),并甚至试图 显示 嵌套的变化在一个简单的 和友好 方式是非常棘手。
如果它适合你的用户基础,一种选择可能是简单化的两个图表作为xml,以及使用喜欢的东西 xml差异.
不隶属于 StackOverflow