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); }
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))); }