示例#1
0
        private IEnumerable <Expression> GetConfiguredToTargetDataSourceMappings(MappingCreationContext context)
        {
            if (!HasConfiguredToTargetDataSources(context.MapperData, out var configuredToTargetDataSources))
            {
                yield break;
            }

            for (var i = 0; i < configuredToTargetDataSources.Count;)
            {
                var configuredToTargetDataSource = configuredToTargetDataSources[i++];
                var newSourceContext             = context.WithDataSource(configuredToTargetDataSource);

                AddPopulationsAndCallbacks(newSourceContext);

                if (newSourceContext.MappingExpressions.None())
                {
                    continue;
                }

                context.UpdateFrom(newSourceContext);

                var mapping = newSourceContext.MappingExpressions.HasOne()
                    ? newSourceContext.MappingExpressions.First()
                    : Expression.Block(newSourceContext.MappingExpressions);

                mapping = MappingFactory.UseLocalToTargetDataSourceVariableIfAppropriate(
                    context.MapperData,
                    newSourceContext.MapperData,
                    configuredToTargetDataSource.Value,
                    mapping);

                if (!configuredToTargetDataSource.IsConditional)
                {
                    yield return(mapping);

                    continue;
                }

                if (context.MapperData.TargetMember.IsComplex || (i > 1))
                {
                    yield return(Expression.IfThen(configuredToTargetDataSource.Condition, mapping));

                    continue;
                }

                var fallback = context.MapperData.LocalVariable.Type.GetEmptyInstanceCreation(
                    context.TargetMember.ElementType,
                    context.MapperData.EnumerablePopulationBuilder.TargetTypeHelper);

                var assignFallback = context.MapperData.LocalVariable.AssignTo(fallback);

                yield return(Expression.IfThenElse(configuredToTargetDataSource.Condition, mapping, assignFallback));
            }
        }
        private Expression GetConfiguredToTargetDataSourceMappingOrNull(
            MappingCreationContext context,
            IConfiguredDataSource toTargetDataSource,
            bool isFirstDataSource)
        {
            if (context.MapperData.Context.IsForToTargetMapping)
            {
                return(null);
            }

            var toTargetContext = context.WithToTargetDataSource(toTargetDataSource);

            AddPopulationsAndCallbacks(toTargetContext);

            if (toTargetContext.MappingExpressions.None())
            {
                return(null);
            }

            context.UpdateFrom(toTargetContext, toTargetDataSource);

            var originalMapperData = context.MapperData;
            var isSequential       = toTargetDataSource.IsSequential;

            if (!isSequential)
            {
                toTargetContext.MappingExpressions.Add(
                    context.MapperData.GetReturnExpression(GetExpressionToReturn(toTargetContext)));
            }

            var toTargetMapping = MappingFactory.UseLocalToTargetDataSourceVariableIfAppropriate(
                originalMapperData,
                toTargetContext.MapperData,
                toTargetDataSource.Value,
                toTargetContext.GetMappingExpression());

            var hasCondition = isSequential
                ? toTargetDataSource.IsConditional
                : toTargetDataSource.HasConfiguredCondition;

            if (!hasCondition)
            {
                return(toTargetMapping);
            }

            Expression fallback;

            if (!isFirstDataSource || originalMapperData.TargetMember.IsComplex)
            {
                if (isSequential || !originalMapperData.TargetMemberIsEnumerableElement())
                {
                    return(Expression.IfThen(toTargetDataSource.Condition, toTargetMapping));
                }

                // Mapping a configured ToTargetInstead() data source to
                // a complex type enumerable element member; reset the
                // local instance variable to null to prevent reuse of a
                // previous element's mapping result:
                fallback = originalMapperData.GetTargetMemberDefault();
            }
            else
            {
                fallback = originalMapperData.LocalVariable.Type.GetEmptyInstanceCreation(
                    context.TargetMember.ElementType,
                    originalMapperData.EnumerablePopulationBuilder.TargetTypeHelper);
            }

            var assignFallback = originalMapperData.LocalVariable.AssignTo(fallback);

            return(Expression.IfThenElse(toTargetDataSource.Condition, toTargetMapping, assignFallback));
        }