سؤال

أرغب في مقارنة كائنين من الإصدارات المختلفة وعرض خلافاتهما في واجهة المستخدم.

أولاً ، أسمي طريقة لمعرفة ما إذا كان هناك أي فرق بين الكائنين

الطريقة هي:

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 ضاع ، وهو أمر مهم بالنسبة لي لعرضه.

كيف يمكنني الحفاظ على هذا النوع من الأشجار أثناء خلق الاختلافات؟ آمل أن أتمكن من جعل مشكلتي مفهومة.

هل كانت مفيدة؟

المحلول

ما تحاول القيام به وعرضه هو بطبيعته معقدة. لقد فعلت ذلك في الماضي (للعمليات المستندة إلى Diffgram/Delta) ، وحتى أحاول ذلك عرض تغييرات متداخلة بسيطة و ودود الطريق صعب.

إذا كان يناسب قاعدة المستخدم الخاصة بك ، فقد يكون أحد الخيارات هو ببساطة تسلسل الرسوم البيانية كـ XML ، واستخدام شيء مثل XML Diff.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top