Skip to content

Dictionary of collection crashes #200

@Pegoth

Description

@Pegoth

When trying to auto map a class with dictonary that has collection values it causes a NullReferenceException.
Running version 1.7.0 from nuget AgileObjects.AgileMapper.

Running the following example will result in an exception catched by the try-catch:

public class A
{
    public Dictionary<string, List<string>> Dict { get; set; }
}

public class B
{
    public Dictionary<string, List<string>> Dict { get; set; }
}

try
{
    var a = new A
    {
        Dict = new Dictionary<string, List<string>> {{"a", new List<string>{"b"}}}
    };

    var b = Mapper.Map(a).ToANew<B>();
}
catch (Exception ex)
{
    var breakpointer = 0;
}

Note: If List<string> is instead string[] it also crashes with the same exception.

Even GetPlanFor causes a crash:

Mapper.GetPlanFor<A>().ToANew<B>() causes a crash.

Stacktrace:

   at AgileObjects.AgileMapper.Members.QualifiedMember.Append(Member childMember)
   at AgileObjects.AgileMapper.Members.Dictionaries.DictionaryEntrySourceMember..ctor(DictionaryEntrySourceMember parent, Member childMember)
   at AgileObjects.AgileMapper.Members.Dictionaries.DictionaryEntrySourceMember.Append(Member childMember)
   at AgileObjects.AgileMapper.Members.MemberExtensionMethods.GetElementMember[TMember](TMember enumerableMember)
   at AgileObjects.AgileMapper.Members.Dictionaries.DictionaryEntrySourceMember.AgileObjects.AgileMapper.Members.IQualifiedMember.GetElementMember()
   at AgileObjects.AgileMapper.ObjectPopulation.Enumerables.EnumerableMappingExpressionFactory.HasCompatibleSourceMember(IMemberMapperData mapperData)
   at AgileObjects.AgileMapper.ObjectPopulation.Enumerables.EnumerableMappingExpressionFactory.TargetCannotBeMapped(IObjectMappingData mappingData, String& reason)
   at AgileObjects.AgileMapper.ObjectPopulation.MappingExpressionFactoryBase.Create(IObjectMappingData mappingData)
   at AgileObjects.AgileMapper.DataSources.Factories.Mapping.MappingDataSourceFactoryBase.CreateFor(IObjectMappingData mappingData)
   at AgileObjects.AgileMapper.DataSources.Factories.Mapping.MappingDataSourceSetFactory.CreateFor(IObjectMappingData mappingData)
   at AgileObjects.AgileMapper.ObjectPopulation.ObjectMapperFactory.Create[TSource,TTarget](ObjectMappingData`2 mappingData)
   at AgileObjects.AgileMapper.ObjectPopulation.ObjectMappingData`2.GetOrCreateMapper()
   at AgileObjects.AgileMapper.ObjectPopulation.MappingFactory.GetInlineMappingBlock(IObjectMappingData mappingData, MappingValues mappingValues, CreateMappingDataCallFactory createMappingDataCallFactory)
   at AgileObjects.AgileMapper.ObjectPopulation.MappingFactory.GetElementMapping(IObjectMappingData elementMappingData, Expression sourceElementValue, Expression targetElementValue)
   at AgileObjects.AgileMapper.ObjectPopulation.MappingFactory.GetElementMapping(Expression sourceElementValue, Expression targetElementValue, IObjectMappingData mappingData)
   at AgileObjects.AgileMapper.ObjectPopulation.Enumerables.EnumerablePopulationBuilder.GetElementMapping(Expression sourceElement, Expression targetElement, IObjectMappingData mappingData)
   at AgileObjects.AgileMapper.ObjectPopulation.Enumerables.EnumerablePopulationBuilder.GetValueCheckedElementMapping(Expression sourceElement, BlockExpression existingElementValueCheck, IObjectMappingData mappingData)
   at AgileObjects.AgileMapper.ObjectPopulation.Enumerables.EnumerablePopulationBuilder.GetElementConversion(Expression sourceElement, IObjectMappingData mappingData)
   at AgileObjects.AgileMapper.ObjectPopulation.Enumerables.Looping.EnumerableSourcePopulationLoopData.GetElementMapping(IObjectMappingData enumerableMappingData)
   at AgileObjects.AgileMapper.ObjectPopulation.Enumerables.Dictionaries.DictionaryPopulationBuilder.GetPopulation(IPopulationLoopData loopData, DictionaryTargetMember dictionaryEntryMember, IObjectMappingData dictionaryMappingData)
   at AgileObjects.AgileMapper.ObjectPopulation.Enumerables.Dictionaries.DictionaryPopulationBuilder.AssignDictionaryEntry(IPopulationLoopData loopData, DictionaryTargetMember dictionaryEntryMember, IObjectMappingData mappingData)
   at AgileObjects.AgileMapper.ObjectPopulation.Enumerables.Dictionaries.DictionaryPopulationBuilder.AssignDictionaryEntryFromKeyValuePair(DictionaryToDictionaryPopulationLoopData loopData, IObjectMappingData mappingData)
   at AgileObjects.AgileMapper.ObjectPopulation.Enumerables.Looping.PopulationLoopDataExtensions.BuildPopulationLoop[TLoopData](TLoopData loopData, EnumerablePopulationBuilder builder, IObjectMappingData mappingData, Func`3 elementPopulationFactory)
   at AgileObjects.AgileMapper.ObjectPopulation.Enumerables.Dictionaries.DictionaryPopulationBuilder.BuildDictionaryToDictionaryPopulationLoop(IObjectMappingData mappingData)
   at AgileObjects.AgileMapper.ObjectPopulation.Enumerables.Dictionaries.DictionaryPopulationBuilder.AddItems(IObjectMappingData mappingData)
   at AgileObjects.AgileMapper.ObjectPopulation.DictionaryMappingExpressionFactory.GetEnumerableToDictionaryMapping(IObjectMappingData mappingData)
   at AgileObjects.AgileMapper.ObjectPopulation.DictionaryMappingExpressionFactory.GetDictionaryPopulation(IObjectMappingData mappingData)
   at AgileObjects.AgileMapper.ObjectPopulation.DictionaryMappingExpressionFactory.AddObjectPopulation(MappingCreationContext context)
   at AgileObjects.AgileMapper.ObjectPopulation.MappingExpressionFactoryBase.<>c__DisplayClass11_0.<AddPopulationsAndCallbacks>b__0(MappingExpressionFactoryBase factory, MappingCreationContext ctx)
   at AgileObjects.AgileMapper.ObjectPopulation.MappingExpressionFactoryBase.AddPopulationsAndCallbacks[TArg](TArg argument, MappingCreationContext context, Action`2 mappingBodyPopulator)
   at AgileObjects.AgileMapper.ObjectPopulation.MappingExpressionFactoryBase.AddPopulationsAndCallbacks(MappingCreationContext context)
   at AgileObjects.AgileMapper.ObjectPopulation.MappingExpressionFactoryBase.Create(IObjectMappingData mappingData)
   at AgileObjects.AgileMapper.DataSources.Factories.Mapping.MappingDataSourceFactoryBase.CreateFor(IObjectMappingData mappingData)
   at AgileObjects.AgileMapper.DataSources.Factories.Mapping.MappingDataSourceSetFactory.CreateFor(IObjectMappingData mappingData)
   at AgileObjects.AgileMapper.ObjectPopulation.ObjectMapperFactory.Create[TSource,TTarget](ObjectMappingData`2 mappingData)
   at AgileObjects.AgileMapper.ObjectPopulation.ObjectMappingData`2.GetOrCreateMapper()
   at AgileObjects.AgileMapper.ObjectPopulation.MappingFactory.GetInlineMappingBlock(IObjectMappingData mappingData, MappingValues mappingValues, CreateMappingDataCallFactory createMappingDataCallFactory)
   at AgileObjects.AgileMapper.ObjectPopulation.MappingFactory.GetChildMapping(IObjectMappingData childMappingData, MappingValues mappingValues, ObjectMapperData declaredTypeMapperData)
   at AgileObjects.AgileMapper.ObjectPopulation.MappingFactory.GetChildMapping(IQualifiedMember sourceMember, Expression sourceMemberAccess, Int32 dataSourceIndex, IChildMemberMappingData childMappingData)
   at AgileObjects.AgileMapper.DataSources.ComplexTypeDataSource.Create(IDataSource wrappedDataSource, Int32 dataSourceIndex, IChildMemberMappingData complexTypeMappingData)
   at AgileObjects.AgileMapper.DataSources.Factories.DataSourceFindContext.GetFinalDataSource(IDataSource foundDataSource, IChildMemberMappingData mappingData)
   at AgileObjects.AgileMapper.DataSources.Factories.DataSourceFindContext.GetSourceMemberDataSource()
   at AgileObjects.AgileMapper.DataSources.Factories.DataSourceFindContext.get_MatchingSourceMemberDataSource()
   at AgileObjects.AgileMapper.DataSources.Factories.DataSourceFindContext.UseSourceMemberDataSource()
   at AgileObjects.AgileMapper.DataSources.Factories.SourceMemberDataSourcesFactory.Create(DataSourceFindContext context)+MoveNext()
   at AgileObjects.AgileMapper.DataSources.Factories.MemberDataSourceSetFactory.EnumerateDataSources(DataSourceFindContext context)+MoveNext()
   at System.Collections.Generic.LargeArrayBuilder`1.AddRange(IEnumerable`1 items)
   at System.Collections.Generic.EnumerableHelpers.ToArray[T](IEnumerable`1 source)
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   at AgileObjects.AgileMapper.DataSources.Factories.MemberDataSourceSetFactory.CreateFor(DataSourceFindContext findContext)
   at AgileObjects.AgileMapper.Members.Population.MemberPopulatorFactory.Create(MemberPopulationContext context)
   at AgileObjects.AgileMapper.Members.Population.MemberPopulatorFactory.<>c.<Create>b__3_0(MemberPopulationContext ctx, QualifiedMember tm)
   at AgileObjects.AgileMapper.Extensions.PublicEnumerableExtensions.Project[TItem,TArg,TResult](IEnumerable`1 items, TArg argument, Func`3 projector)+MoveNext()
   at AgileObjects.AgileMapper.Extensions.PublicEnumerableExtensions.Filter[TItem,TArg](IEnumerable`1 items, TArg argument, Func`3 predicate)+MoveNext()
   at AgileObjects.AgileMapper.ObjectPopulation.ComplexTypes.PopulationExpressionFactoryBase.GetPopulationsAndCallbacks(IObjectMappingData mappingData)+MoveNext()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at AgileObjects.AgileMapper.ObjectPopulation.ComplexTypes.PopulationExpressionFactoryBase.AddPopulation(MappingCreationContext context)
   at AgileObjects.AgileMapper.ObjectPopulation.ComplexTypes.ComplexTypeMappingExpressionFactory.AddObjectPopulation(MappingCreationContext context)
   at AgileObjects.AgileMapper.ObjectPopulation.MappingExpressionFactoryBase.<>c__DisplayClass11_0.<AddPopulationsAndCallbacks>b__0(MappingExpressionFactoryBase factory, MappingCreationContext ctx)
   at AgileObjects.AgileMapper.ObjectPopulation.MappingExpressionFactoryBase.AddPopulationsAndCallbacks[TArg](TArg argument, MappingCreationContext context, Action`2 mappingBodyPopulator)
   at AgileObjects.AgileMapper.ObjectPopulation.MappingExpressionFactoryBase.AddPopulationsAndCallbacks(MappingCreationContext context)
   at AgileObjects.AgileMapper.ObjectPopulation.MappingExpressionFactoryBase.Create(IObjectMappingData mappingData)
   at AgileObjects.AgileMapper.DataSources.ComplexTypeDataSource.Create(IObjectMappingData mappingData)
   at AgileObjects.AgileMapper.DataSources.Factories.Mapping.ComplexTypeMappingDataSourceFactory.CreateFor(IObjectMappingData mappingData)
   at AgileObjects.AgileMapper.DataSources.Factories.Mapping.MappingDataSourceSetFactory.CreateFor(IObjectMappingData mappingData)
   at AgileObjects.AgileMapper.ObjectPopulation.ObjectMapperFactory.Create[TSource,TTarget](ObjectMappingData`2 mappingData)
   at AgileObjects.AgileMapper.ObjectPopulation.ObjectMappingData`2.GetOrCreateMapper()
   at AgileObjects.AgileMapper.ObjectPopulation.ObjectMapperFactory.<>c__6`2.<GetOrCreateRoot>b__6_0(IRootMapperKey key)
   at AgileObjects.AgileMapper.Caching.ArrayCache`2.GetOrAdd(TKey key, Func`2 valueFactory)
   at AgileObjects.AgileMapper.ObjectPopulation.ObjectMapperFactory.GetOrCreateRoot[TSource,TTarget](ObjectMappingData`2 mappingData)
   at AgileObjects.AgileMapper.ObjectPopulation.ObjectMappingData`2..ctor(TSource source, TTarget target, Nullable`1 elementIndex, Object elementKey, MappingTypes mappingTypes, IMappingContext mappingContext, IObjectMappingData declaredTypeMappingData, IObjectMappingData parent, Boolean createMapper)
   at AgileObjects.AgileMapper.ObjectPopulation.ObjectMappingData`2..ctor(TSource source, TTarget target, Nullable`1 elementIndex, Object elementKey, MappingTypes mappingTypes, IMappingContext mappingContext, IObjectMappingData parent, Boolean createMapper)
   at AgileObjects.AgileMapper.ObjectPopulation.ObjectMappingDataFactory.ForRootFixedTypes[TSource,TTarget](TSource source, TTarget target, MappingTypes mappingTypes, IMappingContext mappingContext, Boolean createMapper)
   at AgileObjects.AgileMapper.ObjectPopulation.ObjectMappingDataFactory.ForRootFixedTypes[TSource,TTarget](TSource source, TTarget target, IMappingContext mappingContext, Boolean createMapper)
   at AgileObjects.AgileMapper.ObjectPopulation.ObjectMappingDataFactory.ForRootFixedTypes[TSource,TTarget](IMappingContext mappingContext, Boolean createMapper)
   at AgileObjects.AgileMapper.ObjectPopulation.ObjectMappingDataFactory.ForRootFixedTypes[TSource,TTarget](IMappingContext mappingContext)
   at AgileObjects.AgileMapper.Api.PlanTargetSelector`1.GetMappingPlan[TTarget](IMappingContext planContext, Func`2 mappingDataFactory, ICollection`1 configurations)
   at AgileObjects.AgileMapper.Api.PlanTargetSelector`1.GetMappingPlan[TTarget](MappingRuleSet ruleSet, ICollection`1 configurations)
   at AgileObjects.AgileMapper.Api.PlanTargetSelector`1.ToANew[TResult](Expression`1[] configurations)
   at Dor.UExtractor.Web.Startup.Configure(IApplicationBuilder app) in H:\Sources\Work\UVault\DOR-Dev\trunk\UExtractor\UExtractor.Web\Startup.cs:line 161

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions