Frage

Ich möchte zwei Objekte verschiedener Versionen vergleichen und ihre Unterschiede in UI angezeigt werden soll.

Zuerst rufe ich eine Methode zu wissen, ob es einen Unterschied zwischen den beiden Objekten ist

Die Methode ist:

public bool AreEqual(object object1,object object2, Type comparisionType)

Wenn die obige Methode true zurückgibt, die ich GetDifferences Methode aufrufen, um die Unterschiede zu bekommen, die lautet:

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;
  }
}

Für jede Differenz erstelle ich ein Objekt vom Typ ObjectDifference und fügen Sie den Array. Der markierte Teil ist, wo ich stecken bin! Wenn das Objekt ein anderes komplexes Objekt enthält, Mein Programm gibt mir die Unterschiede aber ich weiß nicht, welche Art es gehörte

Zum Beispiel, ich habe zwei Objekte vom Typ Namen

class Name
{
  string firstName, LastName;
  List phNumber;
}

class PhoneNumber
{
  string officeNo, MobileNo, HomeNo;
}

während den Vergleich zweier Objekte der Ausgang I erhalten ist klar -

  • firstname - John Mary
  • LastName - Cooper Lor
  • officeNo - 22222 44444
  • MobileNo - 989898 089089
  • HomeNo - 4242 43535

Die Hierarchie dass officeNo vom Typ PhoneNumber ist verloren, was wichtig für mich ist, angezeigt werden soll.

Wie soll ich diese Art von Baum halten, während Unterschiede zu schaffen? Hoffe, ich bin in der Lage zu meinem Problem verständlich zu machen.

War es hilfreich?

Lösung

Was Sie versuchen zu tun, und die Anzeige von Natur aus komplex. Ich habe dies in der Vergangenheit getan (für diffgram / Delta-basierten Prozesse) und sogar versuchen, Anzeige verschachtelt Änderungen in einem einfachen und freundlich Weg ist schwierig.

Wenn es Ihre Benutzer-Basis passt, könnte eine Option sein, einfach die beiden Diagramme als XML serialisiert, und verwenden Sie so etwas wie xml diff .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top