Come diff due versioni dello stesso oggetto?
-
22-07-2019 - |
Domanda
Voglio confrontare due oggetti di versioni diverse e mostrare le loro differenze nell'interfaccia utente.
Per prima cosa chiamo un metodo per sapere se c'è qualche differenza tra i due oggetti
Il metodo è:
public bool AreEqual(object object1,object object2, Type comparisionType)
Se il metodo sopra riportato ritorna vero, chiamo il metodo GetDifferences
per ottenere le differenze che sono:
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;
}
}
Per ogni differenza creo un oggetto di tipo ObjectDifference e lo aggiungo alla matrice. La parte evidenziata è quella in cui sono bloccato! Se l'oggetto contiene un altro oggetto complesso, Il mio programma mi dà le differenze ma non so a quale tipo appartenesse
Ad esempio, ho due oggetti di tipo Nome
class Name
{
string firstName, LastName;
List phNumber;
}
class PhoneNumber
{
string officeNo, MobileNo, HomeNo;
}
confrontando due oggetti l'output che ottengo è semplice -
-
nome
- John Mary -
LastName
- cooper Lor -
officeNo
- 22222 44444 -
MobileNo
- 989898 089089 -
HomeNo
- 4242 43535
La gerarchia che officeNo
è del tipo PhoneNumber
è andata persa, il che è importante per me visualizzare.
Come devo mantenere questo tipo di albero mentre creo le differenze? Spero di essere in grado di capire il mio problema.
Soluzione
Quello che stai cercando di fare e visualizzare è intrinsecamente complesso. L'ho fatto in passato (per processi basati su diffgram / delta) e persino provare a visualizzare le modifiche nidificate in un modo semplice e amichevole è complicato.
Se si adatta alla tua base di utenti, un'opzione potrebbe essere quella di serializzare semplicemente i due grafici come xml e utilizzare qualcosa come xml diff .