private EnumerablesComparison(
            IResolver resolver,
            ArrayComparisonEmitter arrayComparisonEmitter,
            EmitCheckIfLoopsAreDoneDelegate emitCheckIfLoopsAreDone,
            IConfigurationProvider configuration,
            IVariable variable)
        {
            _resolver = resolver;
            _arrayComparisonEmitter  = arrayComparisonEmitter;
            _emitCheckIfLoopsAreDone = emitCheckIfLoopsAreDone;
            _configuration           = configuration;
            _variable = variable;

            var variableType = variable.VariableType;

            _elementType = variableType
                           .FindGenericInterface(typeof(IEnumerable <>))
                           .GetGenericArguments()
                           .Single();

            _getEnumeratorMethod = variableType.FindMethod(nameof(IEnumerable.GetEnumerator), Type.EmptyTypes);
            _enumeratorType      = _getEnumeratorMethod.ReturnType;
            _moveNextMethod      = _enumeratorType.FindMethod(nameof(IEnumerator.MoveNext), Type.EmptyTypes);
            _getCurrentMethod    = _enumeratorType.GetPropertyGetter(nameof(IEnumerator.Current));
        }
Ejemplo n.º 2
0
 public ArrayComparisonEmitter(
     IResolver resolver,
     EmitCheckIfLoopsAreDoneDelegate emitCheckIfLoopsAreDone,
     EmitReferenceComparisonDelegate emitReferenceComparison)
 {
     _resolver = resolver;
     _emitCheckIfLoopsAreDone = emitCheckIfLoopsAreDone;
     _emitReferenceComparison = emitReferenceComparison;
 }
        public static EnumerablesComparison Create(
            IResolver comparisons,
            ArrayComparisonEmitter arrayComparisonEmitter,
            EmitCheckIfLoopsAreDoneDelegate emitCheckIfLoopsAreDone,
            IConfigurationProvider configuration,
            IVariable variable)
        {
            var variableType = variable.VariableType;

            if (variableType.ImplementsGenericInterface(typeof(IEnumerable <>)) && !variableType.IsArray)
            {
                return(new EnumerablesComparison(comparisons, arrayComparisonEmitter, emitCheckIfLoopsAreDone, configuration, variable));
            }

            return(null);
        }