private ObjectMapperData( IObjectMappingData mappingData, IQualifiedMember sourceMember, QualifiedMember targetMember, int?dataSourceIndex, ObjectMapperData declaredTypeMapperData, ObjectMapperData parent, bool isForStandaloneMapping) : base( mappingData.MappingContext.RuleSet, sourceMember.Type, targetMember.Type, sourceMember, targetMember, parent) { MapperContext = mappingData.MappingContext.MapperContext; DeclaredTypeMapperData = OriginalMapperData = declaredTypeMapperData; _childMapperDatas = new List <ObjectMapperData>(); DataSourceIndex = dataSourceIndex.GetValueOrDefault(); MappingDataObject = GetMappingDataObject(parent); SourceMember = sourceMember; var mappingDataType = typeof(IMappingData <,>).MakeGenericType(SourceType, TargetType); SourceObject = GetMappingDataProperty(mappingDataType, RootSourceMemberName); TargetObject = GetMappingDataProperty(RootTargetMemberName); CreatedObject = GetMappingDataProperty(nameof(CreatedObject)); var isPartOfDerivedTypeMapping = declaredTypeMapperData != null; if (isPartOfDerivedTypeMapping) { EnumerableIndex = declaredTypeMapperData.EnumerableIndex; ParentObject = declaredTypeMapperData.ParentObject; } else { EnumerableIndex = GetMappingDataProperty(mappingDataType, nameof(EnumerableIndex)); ParentObject = GetMappingDataProperty(nameof(Parent)); } ExpressionInfoFinder = new ExpressionInfoFinder(MappingDataObject); DataSourcesByTargetMember = new Dictionary <QualifiedMember, DataSourceSet>(); ReturnLabelTarget = Expression.Label(TargetType, "Return"); _mappedObjectCachingMode = MapperContext.UserConfigurations.CacheMappedObjects(this); if (targetMember.IsEnumerable) { EnumerablePopulationBuilder = new EnumerablePopulationBuilder(this); } if (IsRoot) { TargetTypeHasNotYetBeenMapped = true; TargetTypeWillNotBeMappedAgain = IsTargetTypeLastMapping(parent); Context = new MapperDataContext(this, true, isPartOfDerivedTypeMapping); return; } parent._childMapperDatas.Add(this); Parent = parent; if (!this.TargetMemberIsEnumerableElement()) { TargetTypeHasNotYetBeenMapped = IsTargetTypeFirstMapping(parent); TargetTypeWillNotBeMappedAgain = IsTargetTypeLastMapping(parent); } Context = new MapperDataContext( this, isForStandaloneMapping, isPartOfDerivedTypeMapping || parent.Context.IsForDerivedType); }
private ObjectMapperData( IMappingContext mappingContext, IQualifiedMember sourceMember, QualifiedMember targetMember, int?dataSourceIndex, ObjectMapperData declaredTypeMapperData, ObjectMapperData parent, bool isForStandaloneMapping) : base( mappingContext.RuleSet, sourceMember, targetMember, parent, mappingContext.MapperContext) { DataSourceIndex = dataSourceIndex.GetValueOrDefault(); CreatedObject = GetMappingDataProperty(nameof(CreatedObject)); var isPartOfDerivedTypeMapping = declaredTypeMapperData != null; if (isPartOfDerivedTypeMapping) { DeclaredTypeMapperData = OriginalMapperData = declaredTypeMapperData; ElementIndex = declaredTypeMapperData.ElementIndex; ElementKey = declaredTypeMapperData.ElementKey; ParentObject = declaredTypeMapperData.ParentObject; declaredTypeMapperData.DerivedMapperDatas.Add(this); } else { ElementIndex = GetElementIndexAccess(); ElementKey = GetElementKeyAccess(); ParentObject = GetParentObjectAccess(); } _returnLabelTarget = Expression.Label(TargetType, "Return"); _mappedObjectCachingMode = MapperContext.UserConfigurations.CacheMappedObjects(this); if (targetMember.IsEnumerable) { EnumerablePopulationBuilder = new EnumerablePopulationBuilder(this); } if (IsRoot) { TargetTypeWillNotBeMappedAgain = IsTargetTypeLastMapping(parent); Context = new MapperDataContext(this, true, isPartOfDerivedTypeMapping); return; } parent.ChildMapperDatas.Add(this); if (this.TargetMemberIsEnumerableElement()) { TargetTypeHasBeenMappedBefore = true; } else { TargetTypeHasBeenMappedBefore = IsNotTargetTypeFirstMapping(parent); TargetTypeWillNotBeMappedAgain = IsTargetTypeLastMapping(parent); } Context = new MapperDataContext( this, isForStandaloneMapping, isPartOfDerivedTypeMapping || parent.Context.IsForDerivedType); }