2009-03-13 15 views
8

Quiero comparar dos objetos de diferentes versiones y mostrar sus diferencias en la interfaz de usuario.¿Cómo se difieren dos versiones del mismo objeto?

Primero llamar a un método para saber si hay alguna diferencia entre los dos objetos

El método es:

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

Si el método anterior devuelve verdadero, que llamo el método GetDifferences para obtener el diferencias que es:

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

para cada diferencia puedo crear un objeto de tipo ObjectDifference y añadirlo a la matriz. ¡La parte resaltada es a la que estoy atascado! Si el objeto contiene otro objeto complejo, Mi programa hace dame las diferencias pero no sé qué tipo pertenecía a

Por ejemplo, tengo dos objetos de tipo Nombre

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

class PhoneNumber 
{ 
    string officeNo, MobileNo, HomeNo; 
} 

al comparar dos objetos de las salida que se ve es llano -

  • firstname - Juan María
  • LastName - Cooper Lor
  • officeNo - 22222 44444
  • MobileNo - 989898 089089
  • HomeNo - 4242 43535

la jerarquía que officeNo es de tipo PhoneNumber se pierde, lo cual es importante para mí que se vea.

¿Cómo debería mantener este tipo de árbol, mientras que la creación de diferencias? Espero ser capaz de entender mi problema.

Respuesta

6

Lo que estamos tratando de hacer y de visualización es inherentemente complejos. He hecho esto en el pasado (para los procesos de DiffGram/basado en el delta), e incluso tratando de pantalla cambios anidados en un sencillo y agradable manera es difícil.

Si se ajusta a su base de usuarios, una opción podría ser simplemente serializar los dos gráficos como xml, y usar algo como xml diff.

Cuestiones relacionadas