private static void CompareEnumarableItemObject(IEnumerable sourceObject, IEnumerable targetObject, ObjectCompareResultCollection updated, ObjectCompareResultCollection addOrDeleted, Func <ObjectCompareInfo, object, object, ObjectCompareResult> createItemResult) { if (sourceObject != null) { foreach (object sourceValue in sourceObject) { if (sourceValue != null) { ObjectCompareInfo compareInfo = sourceValue.GetType().GetCompareInfo(); string[] compareKeyFields = compareInfo.GetCompareKeyFields(); object targetValue = targetObject.FirstOrDefault <object>(t => IsSameCompareKey(compareInfo.GetCompareKeyFields(), sourceValue, t)); ObjectCompareResult itemResult = createItemResult(compareInfo, sourceValue, targetValue); if (itemResult.AreDifferent) { ObjectCompareResultCollection resultCollection = GetCollectionByCompareValues(sourceValue, targetValue, updated, addOrDeleted); if (resultCollection != null) { resultCollection.Add(itemResult); } } } } } }
/// <summary> /// /// </summary> /// <param name="sourceObject"></param> /// <param name="compareObject"></param> /// <returns></returns> public static ObjectCompareResult CompareObject(object sourceObject, object compareObject) { ObjectCompareInfo compareInfo = GetCompareInfo(sourceObject, compareObject); ObjectCompareResult result = null; if (compareInfo == null) { result = new ObjectCompareResult(); } else { result = CompareObject(compareInfo, sourceObject, compareObject); } return(result); }
/// <summary> /// /// </summary> /// <param name="compareInfo"></param> /// <param name="sourceObject"></param> /// <param name="targetObject"></param> /// <returns></returns> public static ObjectCompareResult CompareObject(ObjectCompareInfo compareInfo, object sourceObject, object targetObject) { compareInfo.NullCheck("compareInfo"); ObjectCompareResult result = new ObjectCompareResult(compareInfo.ObjectTypeName); //如果是同一个对象,则直接返回 if (object.ReferenceEquals(sourceObject, targetObject)) { return(result); } foreach (PropertyCompareInfo pci in compareInfo.Properties) { object sourceValue = GetPropertyValue(sourceObject, pci.PropertyName); object targetValue = GetPropertyValue(targetObject, pci.PropertyName); if (object.Equals(sourceValue, targetValue) == false) { ObjectPropertyCompareResult item = new ObjectPropertyCompareResult(pci, sourceValue, targetValue); if (sourceValue.IsEnumerableObject() || targetValue.IsEnumerableObject()) { item.SubObjectCompareResult = CompareEnumerableObject(sourceValue as IEnumerable, targetValue as IEnumerable); } else { item.SubObjectCompareResult = CompareObject(sourceValue, targetValue); } result.Add(item); } } result.Sort((r1, r2) => r1.SortID - r2.SortID); return(result); }