65.9K
CodeProject 正在变化。 阅读更多。
Home

比较同一类的两个复杂对象

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.47/5 (6投票s)

2015年11月3日

CPOL
viewsIcon

26963

使用反射和扩展方法比较同一类的两个对象

引言

本技巧展示了如何使用反射和扩展方法比较同一类的两个对象。

背景

你有两个相同类的对象(类包含子类、属性,子类包含属性等),你需要比较这两个对象是否相同。此技术不需要继承 IEqualsIComparable 接口。

Using the Code

创建一个名为“CompareTwoObjects”的 static 类,并添加以下代码到其中

public static object  CompareEquals<T>(this T objectFromCompare, T objectToCompare)
{
   if (objectFromCompare == null && objectToCompare == null)
      return true;

   else if (objectFromCompare == null && objectToCompare != null)
      return false;

   else if (objectFromCompare != null && objectToCompare == null)
      return false;

   PropertyInfo[] props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
   foreach (PropertyInfo prop in props)
      {
          object dataFromCompare = 
          objectFromCompare.GetType().GetProperty(prop.Name).GetValue(objectFromCompare, null);

          object dataToCompare = 
          objectToCompare.GetType().GetProperty(prop.Name).GetValue(objectToCompare, null);

          Type type = 
          objectFromCompare.GetType().GetProperty(prop.Name).GetValue(objectToCompare,null).GetType();

          if (prop.PropertyType.IsClass && 
          !prop.PropertyType.FullName.Contains("System.String"))
             {
                 dynamic convertedFromValue = Convert.ChangeType(dataFromCompare, type);
                 dynamic convertedToValue = Convert.ChangeType(dataToCompare, type);

                 object result = CompareTwoObjects.CompareEquals(convertedFromValue, convertedToValue);

                 bool compareResult = (bool)result;
                 if (!compareResult)
                    return false;
              }

          else if (!dataFromCompare.Equals(dataToCompare))
              return false;
       }

  return true;
}

这会判断类及其子类的所有属性是否包含相同的值。

用法

Object1.CompareEquals(Object2);

关注点

以前,我看到要比较两个对象,需要实现 IEqualsIComparable 接口,然后显式地循环遍历每个属性,以确保值是否相同。但我的代码是通用的,并且可靠且独立。

历史

我使用了扩展方法概念和反射,这使得比较两个对象变得容易,并且代码量最少。

© . All rights reserved.