private static bool Match(object originalValue, object copyValue) { // If a custom IMatchable description exists use it to determine if there is a match IProjMatchable originalMatch = originalValue as IProjMatchable; IProjMatchable copyMatch = copyValue as IProjMatchable; if (originalMatch != null && copyMatch != null) { bool res = originalMatch.Matches(copyMatch); return(res); } // Strings are enumerable, so test them first, since string.Equals should be faster than // cycling through each character. string origString = originalValue as string; if (origString != null) { string mString = copyValue as string; if (mString == null) { return(false); } return(origString.Equals(mString)); } // If the object is an enumeration, test the members of the enumeration. // If any members fail the match test, then the whole collection fails the match. IEnumerable originalList = originalValue as IEnumerable; if (originalList != null) { IEnumerable copyList = copyValue as IEnumerable; if (copyList != null) { IEnumerator e = copyList.GetEnumerator(); e.MoveNext(); foreach (object originalItem in originalList) { if (Match(originalItem, e.Current) == false) { return(false); } e.MoveNext(); } } return(true); } if (originalValue == null && copyValue == null) { return(true); } // If the objects are not collections and are not IMatchable, the only remaining thing we can // realistically test is simple equality. // Don't use == here! It will always be false for boxed value types. return(originalValue != null && (originalValue.Equals(copyValue))); }
/// <summary> /// This tests the public properties from the two objects. If any properties implement /// the IMatchable interface, and do not match, this returns false. If any public /// properties are value types, and they are not equal, then this returns false. /// </summary> /// <param name="self">This matchable item </param> /// <param name="other">The other item to compare to this item</param> /// <returns>Boolean, true if there is a match</returns> public static bool Matches(this IProjMatchable self, IProjMatchable other) { List <string> ignoreMe; return(self.Matches(other, out ignoreMe)); }