protected virtual PropertyDiff[] GetPropertyDiff(IDiffAdaptor currentAdaptor, object currentObject, IDiffAdaptor newAdaptor, object newObject) { ArrayList changes = new ArrayList(); Hashtable found = new Hashtable(); // Look for modified and deleted elements if (currentObject != null) { foreach (object oldProp in currentAdaptor.GetProperties(currentObject)) { string name = currentAdaptor.GetPropertyName(oldProp); object newProp = newObject != null?newAdaptor.GetPropertyByName(newObject, name) : null; if (newProp == null) { changes.Add(new PropertyDiff(DiffOperation.Remove, name, null)); } else { found [name] = found; string newValue = newAdaptor.GetPropertyValue(newObject, newProp); if (newValue != currentAdaptor.GetPropertyValue(currentObject, oldProp)) { changes.Add(new PropertyDiff(DiffOperation.Update, name, newValue)); } } } } // Look for new elements if (newObject != null) { foreach (object newProp in newAdaptor.GetProperties(newObject)) { string name = newAdaptor.GetPropertyName(newProp); if (!found.ContainsKey(name)) { changes.Add(new PropertyDiff(DiffOperation.Add, name, newAdaptor.GetPropertyValue(newObject, newProp))); } } } if (changes.Count == 0) { return(null); } return((PropertyDiff[])changes.ToArray(typeof(PropertyDiff))); }
protected virtual PropertyDiff[] GetPropertyDiff (IDiffAdaptor currentAdaptor, object currentObject, IDiffAdaptor newAdaptor, object newObject) { ArrayList changes = new ArrayList (); Hashtable found = new Hashtable (); // Look for modified and deleted elements if (currentObject != null) { foreach (object oldProp in currentAdaptor.GetProperties (currentObject)) { string name = currentAdaptor.GetPropertyName (oldProp); object newProp = newObject != null ? newAdaptor.GetPropertyByName (newObject, name) : null; if (newProp == null) changes.Add (new PropertyDiff (DiffOperation.Remove, name, null)); else { found [name] = found; string newValue = newAdaptor.GetPropertyValue (newObject, newProp); if (newValue != currentAdaptor.GetPropertyValue (currentObject, oldProp)) changes.Add (new PropertyDiff (DiffOperation.Update, name, newValue)); } } } // Look for new elements if (newObject != null) { foreach (object newProp in newAdaptor.GetProperties (newObject)) { string name = newAdaptor.GetPropertyName (newProp); if (!found.ContainsKey (name)) changes.Add (new PropertyDiff (DiffOperation.Add, name, newAdaptor.GetPropertyValue (newObject, newProp))); } } if (changes.Count == 0) return null; return (PropertyDiff[]) changes.ToArray (typeof(PropertyDiff)); }