public StructuralEqualityComparer(Func <PropertyInfo, bool> excludePredicate = null, StructuralEqualityComparerOptions options = null) { Func <PropertyInfo, bool> defaultExcludePredicate = (propertyInfo) => false; _excludePredicate = excludePredicate ?? defaultExcludePredicate; _options = options; }
/// <summary> /// Adds a matching criterion to the structural equality comparer. /// </summary> /// <remarks> /// <para> /// The enumerations of values returned by the accessor are compared by using the specified comparer. /// </para> /// </remarks> /// <example> /// <code><![CDATA[ /// public class Foo /// { /// public int[] Values; /// } /// /// [TestFixture] /// public class FooTest /// { /// [Test] /// public void MyTest() /// { /// var foo1 = new Foo() { Values = new int[] { 1, 2, 3, 4, 5 } }; /// var foo2 = new Foo() { Values = new int[] { 5, 4, 3, 2, 1 } }; /// /// Assert.AreEqual(foo1, foo2, new StructuralEqualityComparer<Foo> /// { /// { x => x.Values, /// new StructuralEqualityComparer<int> { { x => x } }, /// StructuralEqualityComparerOptions.IgnoreEnumerableOrder /// }, /// }); /// } /// } /// ]]></code> /// </example> /// <typeparam name="TValue">The type of the value returned by the accessor.</typeparam> /// <param name="accessor">An accessor that gets an enumeration of values from the tested object.</param> /// <param name="comparer">A comparer instance for the values returned by the accessor, or null to use the default one.</param> /// <param name="options">Some options indicating how to compare the enumeration of values returned by the accessor.</param> /// <exception cref="ArgumentNullException">The specified accessor argument is a null reference.</exception> public void Add <TValue>(Accessor <T, IEnumerable <TValue> > accessor, EqualityComparison <TValue> comparer, StructuralEqualityComparerOptions options) { if (comparer == null) { comparer = ComparisonSemantics.Default.Equals <TValue>; } if ((options & StructuralEqualityComparerOptions.IgnoreEnumerableOrder) != 0) { conditions.Add((x, y) => CompareEnumerablesIgnoringOrder(accessor(x), accessor(y), comparer)); } else { conditions.Add((x, y) => CompareEnumerables(accessor(x), accessor(y), comparer)); } }
/// <summary> /// Adds a matching criterion to the structural equality comparer. /// </summary> /// <remarks> /// <para> /// The enumerations of values returned by the accessor are compared by using the specified comparer. /// </para> /// </remarks> /// <example> /// <code><![CDATA[ /// public class Foo /// { /// public int[] Values; /// } /// /// [TestFixture] /// public class FooTest /// { /// [Test] /// public void MyTest() /// { /// var foo1 = new Foo() { Values = new int[] { 1, 2, 3, 4, 5 } }; /// var foo2 = new Foo() { Values = new int[] { 5, 4, 3, 2, 1 } }; /// /// Assert.AreEqual(foo1, foo2, new StructuralEqualityComparer<Foo> /// { /// { x => x.Values, /// new StructuralEqualityComparer<int> { { x => x } }, /// StructuralEqualityComparerOptions.IgnoreEnumerableOrder /// }, /// }); /// } /// } /// ]]></code> /// </example> /// <typeparam name="TValue">The type of the value returned by the accessor.</typeparam> /// <param name="accessor">An accessor that gets an enumeration of values from the tested object.</param> /// <param name="comparer">A comparer instance for the values returned by the accessor, or null to use the default one.</param> /// <param name="options">Some options indicating how to compare the enumeration of values returned by the accessor.</param> /// <exception cref="ArgumentNullException">The specified accessor argument is a null reference.</exception> public void Add <TValue>(Accessor <T, IEnumerable <TValue> > accessor, IEqualityComparer <TValue> comparer, StructuralEqualityComparerOptions options) { Add(accessor, (comparer ?? StructuralEqualityComparer <TValue> .Default).Equals, options); }