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






3.47/5 (6投票s)
使用反射和扩展方法比较同一类的两个对象
引言
本技巧展示了如何使用反射和扩展方法比较同一类的两个对象。
背景
你有两个相同类的对象(类包含子类、属性,子类包含属性等),你需要比较这两个对象是否相同。此技术不需要继承 IEquals
、IComparable
接口。
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);
关注点
以前,我看到要比较两个对象,需要实现 IEquals
、IComparable
接口,然后显式地循环遍历每个属性,以确保值是否相同。但我的代码是通用的,并且可靠且独立。
历史
我使用了扩展方法概念和反射,这使得比较两个对象变得容易,并且代码量最少。