private ObjectMapperData( IObjectMappingData mappingData, IQualifiedMember sourceMember, QualifiedMember targetMember, int?dataSourceIndex, ObjectMapperData declaredTypeMapperData, ObjectMapperData parent, bool isForStandaloneMapping) : base( mappingData.MappingContext.RuleSet, sourceMember.Type, targetMember.Type, targetMember, parent) { MapperContext = mappingData.MappingContext.MapperContext; DeclaredTypeMapperData = declaredTypeMapperData; _childMapperDatas = new List <ObjectMapperData>(); DataSourceIndex = dataSourceIndex.GetValueOrDefault(); MappingDataObject = GetMappingDataObject(parent); SourceMember = sourceMember; var mappingDataType = typeof(IMappingData <,>).MakeGenericType(SourceType, TargetType); SourceObject = GetMappingDataProperty(mappingDataType, "Source"); TargetObject = Expression.Property(MappingDataObject, "Target"); CreatedObject = Expression.Property(MappingDataObject, "CreatedObject"); var isPartOfDerivedTypeMapping = declaredTypeMapperData != null; if (isPartOfDerivedTypeMapping) { EnumerableIndex = declaredTypeMapperData.EnumerableIndex; ParentObject = declaredTypeMapperData.ParentObject; } else { EnumerableIndex = GetMappingDataProperty(mappingDataType, "EnumerableIndex"); ParentObject = Expression.Property(MappingDataObject, "Parent"); } NestedAccessFinder = new NestedAccessFinder(MappingDataObject); _mapChildMethod = GetMapMethod(MappingDataObject.Type, 4); _mapElementMethod = GetMapMethod(MappingDataObject.Type, 3); _dataSourcesByTargetMemberName = new Dictionary <string, DataSourceSet>(); DataSourcesByTargetMember = new Dictionary <QualifiedMember, DataSourceSet>(); if (targetMember.IsEnumerable) { EnumerablePopulationBuilder = new EnumerablePopulationBuilder(this); } else { TargetTypeHasNotYetBeenMapped = IsTargetTypeFirstMapping(parent); TargetTypeWillNotBeMappedAgain = IsTargetTypeLastMapping(); _instanceVariable = Expression .Variable(TargetType, TargetType.GetVariableNameInCamelCase()); } ReturnLabelTarget = Expression.Label(TargetType, "Return"); if (isForStandaloneMapping) { RequiredMapperFuncsByKey = new Dictionary <ObjectMapperKeyBase, LambdaExpression>(); } if (IsRoot) { Context = new MapperDataContext(this, isForStandaloneMapping, isPartOfDerivedTypeMapping); return; } Context = new MapperDataContext( this, isForStandaloneMapping, isPartOfDerivedTypeMapping || parent.Context.IsForDerivedType); parent._childMapperDatas.Add(this); Parent = parent; }