private void BuildDictionaryToDictionaryPopulationLoop(IObjectMappingData mappingData)
        {
            var mapperData = mappingData.MapperData;
            var loopData   = new DictionaryToDictionaryPopulationLoopData(_sourceDictionaryMember, mapperData);

            var populationLoop = loopData.BuildPopulationLoop(
                mapperData.EnumerablePopulationBuilder,
                mappingData,
                AssignDictionaryEntryFromKeyValuePair);

            _mappingExpressions.Add(populationLoop);
        }
Exemplo n.º 2
0
        private Expression AssignDictionaryEntryFromKeyValuePair(
            DictionaryToDictionaryPopulationLoopData loopData,
            IObjectMappingData mappingData)
        {
            var keyVariable   = Expression.Variable(_targetDictionaryMember.KeyType, "targetKey");
            var keyAccess     = Expression.Property(loopData.SourceElement, "Key");
            var keyConversion = MapperData.GetValueConversion(keyAccess, keyVariable.Type);
            var keyAssignment = keyVariable.AssignTo(keyConversion);

            var dictionaryEntryMember = _targetDictionaryMember.Append(keyVariable);
            var targetEntryAssignment = AssignDictionaryEntry(loopData, dictionaryEntryMember, mappingData);

            return(Expression.Block(new[] { keyVariable }, keyAssignment, targetEntryAssignment));
        }
        private Expression AssignDictionaryEntryFromKeyValuePair(
            DictionaryToDictionaryPopulationLoopData loopData,
            IObjectMappingData mappingData)
        {
            var keyVariable   = (ParameterExpression)_wrappedBuilder.GetElementKey();
            var keyAccess     = Expression.Property(loopData.SourceElement, "Key");
            var keyConversion = MapperData.GetValueConversion(keyAccess, keyVariable.Type);
            var keyAssignment = keyVariable.AssignTo(keyConversion);

            var dictionaryEntryMember = _targetDictionaryMember.Append(keyVariable);
            var targetEntryAssignment = AssignDictionaryEntry(loopData, dictionaryEntryMember, mappingData);

            if (targetEntryAssignment.NodeType != ExpressionType.Block)
            {
                return(Expression.Block(new[] { keyVariable }, keyAssignment, targetEntryAssignment));
            }

            var targetEntryAssignmentBlock = (BlockExpression)targetEntryAssignment;

            return(Expression.Block(
                       targetEntryAssignmentBlock.Variables.Append(keyVariable),
                       targetEntryAssignmentBlock.Expressions.Prepend(keyAssignment)));
        }