private static AggregatedDifference AnonymousTypeDifference <TA, TE>(TA actual, TE expected, Type type, AggregatedDifference result) { var criteria = new ClassMemberCriteria(BindingFlags.Instance); criteria.SetPublic(); criteria.CaptureProperties(); criteria.CaptureFields(); // use field based comparison var wrapper = ReflectionWrapper.BuildFromInstance(type, expected, criteria); var actualWrapped = ReflectionWrapper.BuildFromInstance(actual.GetType(), actual, criteria); foreach (var match in actualWrapped.MemberMatches(wrapper).Where(match => !match.DoValuesMatches)) { result.Add(DifferenceDetails.FromMatch(match)); } return(result); }
internal List <MemberMatch> MemberMatches <TU>(TU expectedValue) { var expectedWrapped = ReflectionWrapper.BuildFromInstance(expectedValue?.GetType() ?? typeof(TU), expectedValue, this.Criteria); var result = new List <MemberMatch>(); expectedWrapped.MapFields(this, 1, (expected, actual, depth) => { if (actual?.Value == null || expected?.Value == null) { result.Add(new MemberMatch(expected, actual)); return(false); } if (depth <= 0 && expected.ValueType.ImplementsEquals()) { result.Add(new MemberMatch(expected, actual)); return(false); } if (!expected.IsArray) { return(true); } if (actual.IsArray && ((Array)expected.Value).Length == ((Array)actual.Value).Length) { return(true); } result.Add(new MemberMatch(expected, actual)); return(false); }); return(result); }