public EqualityResolver( EqualityContext context, MembersProvider membersProvider, IConfigurationProvider configuration) { _configuration = configuration; var collectionComparer = new ArrayComparisonEmitter(this, CustomEmitters.EmitCheckIfLoopsAreDone, CustomEmitters.EmitReferenceComparison); _comparisonFactories = new Func <IVariable, IComparisonEmitter>[] { variable => NullableComparison.Create(this, CustomEmitters.EmitReturnIfFalsy, CustomEmitters.EmitCheckNullablesForValue, variable), CeqEqualityComparison.Create, variable => StringsComparison.Create(StringEqualsMethod, CustomEmitters.EmitReturnIfFalsy, _configuration, variable), OperatorEqualityComparison.Create, BacisEqualityComparison.Create, variable => MembersComparison.Create(this, membersProvider, variable), variable => ArraysComparison.Create(collectionComparer, _configuration, variable), variable => EnumerablesComparison.Create(this, collectionComparer, CustomEmitters.EmitCheckIfLoopsAreDone, _configuration, variable), variable => IndirectComparison.Create( CustomEmitters.EmitReturnIfFalsy, context.GetStaticEqualsMethodInfo, DelayedEquals, variable) }; }
public IComparisonEmitter GetComparisonEmitter(IVariable variable) { var hasCustomComparer = _configuration.HasCustomComparer(variable.VariableType); if (hasCustomComparer) { return(IndirectComparison.Create(CustomEmitters.EmitReturnIfTruthy, DelayedCompare, variable)); } var comparison = _comparisonFactories .Select(factory => factory(variable)) .FirstOrDefault(x => x != null); if (comparison == null) { throw new NotSupportedException($"{variable.VariableType.DisplayName()} is not supported."); } return(comparison); }
public ComparisonResolver(ComparerContext context, MembersProvider membersProvider, IConfigurationProvider configuration) { _configuration = configuration; var collectionComparer = new ArrayComparisonEmitter(this, CustomEmitters.EmitCheckIfLoopsAreDone, CustomEmitters.EmitReferenceComparison); _comparisonFactories = new Func <IVariable, IComparisonEmitter>[] { variable => NullableComparison.Create(this, CustomEmitters.EmitReturnIfTruthy, CustomEmitters.EmitCheckNullablesForValue, variable), IntegralsComparison.Create, variable => StringsComparison.Create(StringCompareMethod, CustomEmitters.EmitReturnIfTruthy, _configuration, variable), ComparablesComparison.Create, variable => MembersComparison.Create(this, membersProvider, variable), variable => ArraysComparison.Create(collectionComparer, _configuration, variable), variable => EnumerablesComparison.Create(this, collectionComparer, CustomEmitters.EmitCheckIfLoopsAreDone, _configuration, variable), variable => IndirectComparison.Create( CustomEmitters.EmitReturnIfTruthy, variableType => context.GetStaticCompareMethodInfo(variableType), DelayedCompare, variable) }; }