2009-03-13 6 views
8

Я хочу сравнить два объекта разных версий и показать их различия в пользовательском интерфейсе.Как отличить две версии одного и того же объекта?

Сначала я вызвать метод, чтобы узнать, есть ли какая-то разница между этими двумя объектами

Метод является:

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 44444
  • MobileNo - 989898 089089
  • HomeNo - 4242 43535

Иерархия, что officeNo имеет тип PhoneNumber теряется, что очень важно для меня, чтобы отобразить.

Как я должен поддерживать этот тип дерева при создании различий? Надеюсь, что смогу понять мою проблему.

ответ

6

То, что вы пытаетесь сделать и отображаете, по своей сути сложное. Я делал это в прошлом (для процессов с использованием diffgram/delta), и даже пытался показать дисплей вложенные изменения в простой и дружеский способ - это сложно.

Если он подходит для вашей пользовательской базы, одним из вариантов может быть просто сериализация двух графиков в виде xml и использование чего-то типа xml diff.