示例#1
0
        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));
		}