agileobjects/AgileMapper

Dictionary<string, arrayofclass> fails

Pegoth opened this issue · 4 comments

When trying to map a class that has a Dictionary<string, array of class> property it crashes, even when only getting the plan.

Note: It doesn't matter what the class C has.

Example code (https://dotnetfiddle.net/Widget/wXVQPI):

using System;
using System.Collections.Generic;
using AgileObjects.AgileMapper;

public class Program
{
	public static void Main()
	{
		try
		{
			var a = Mapper.GetPlanFor<A>().ToANew<B>().ToString();
		}
		catch (Exception ex)
		{
			Console.WriteLine(ex.Message);
			Console.WriteLine(ex.StackTrace);
		}
	}
}

public class A
{
	public Dictionary<string, C[]> TestDictionary { get; set; }
}

public class B
{
	public Dictionary<string, C[]> TestDictionary { get; set; }
}

public class C
{
	public string TestProperty { get; set; }
}

Message: Reference equality is not defined for the types 'C[]' and 'C'.
StackTrace:

 at System.Linq.Expressions.Expression.ReferenceEqual(Expression left, Expression right)
   at System.Linq.Expressions.BinaryExpression.Update(Expression left, LambdaExpression conversion, Expression right)
   at AgileObjects.AgileMapper.Extensions.Internal.ExpressionExtensions.ExpressionReplacer.<ReplaceIn>b__11_0(BinaryExpression b)
   at AgileObjects.AgileMapper.Extensions.Internal.ExpressionExtensions.ExpressionReplacer.ReplaceIn[TExpression](TExpression expression, Func`2 replacer)
   at AgileObjects.AgileMapper.Extensions.Internal.ExpressionExtensions.ExpressionReplacer.ReplaceIn(BinaryExpression binary)
   at AgileObjects.AgileMapper.Extensions.Internal.ExpressionExtensions.ExpressionReplacer.ReplaceIn(Expression expression)
   at AgileObjects.AgileMapper.Extensions.Internal.ExpressionExtensions.ExpressionReplacer.ReplaceIn[TExpression](TExpression expression, Func`2 replacer)
   at AgileObjects.AgileMapper.Extensions.Internal.ExpressionExtensions.ExpressionReplacer.Replace(Expression expression)
   at AgileObjects.AgileMapper.Extensions.Internal.ExpressionExtensions.ExpressionReplacer.<ReplaceIn>b__12_0(ConditionalExpression cnd)
   at AgileObjects.AgileMapper.Extensions.Internal.ExpressionExtensions.ExpressionReplacer.ReplaceIn[TExpression](TExpression expression, Func`2 replacer)
   at AgileObjects.AgileMapper.Extensions.Internal.ExpressionExtensions.ExpressionReplacer.ReplaceIn(ConditionalExpression conditional)
   at AgileObjects.AgileMapper.Extensions.Internal.ExpressionExtensions.ExpressionReplacer.ReplaceIn(Expression expression)
   at AgileObjects.AgileMapper.Extensions.Internal.ExpressionExtensions.ExpressionReplacer.ReplaceIn[TExpression](TExpression expression, Func`2 replacer)
   at AgileObjects.AgileMapper.Extensions.Internal.ExpressionExtensions.ExpressionReplacer.Replace(Expression expression)
   at AgileObjects.AgileMapper.Extensions.Internal.ExpressionExtensions.ExpressionReplacer.ReplaceIn[TItem](IList`1 items, Func`2 replacer)
   at AgileObjects.AgileMapper.Extensions.Internal.ExpressionExtensions.ExpressionReplacer.ReplaceIn(IList`1 expressions)
   at AgileObjects.AgileMapper.Extensions.Internal.ExpressionExtensions.ExpressionReplacer.<ReplaceIn>b__13_0(BlockExpression b)
   at AgileObjects.AgileMapper.Extensions.Internal.ExpressionExtensions.ExpressionReplacer.ReplaceIn[TExpression](TExpression expression, Func`2 replacer)
   at AgileObjects.AgileMapper.Extensions.Internal.ExpressionExtensions.ExpressionReplacer.ReplaceIn(BlockExpression block)
   at AgileObjects.AgileMapper.Extensions.Internal.ExpressionExtensions.ExpressionReplacer.ReplaceIn(Expression expression)
   at AgileObjects.AgileMapper.Extensions.Internal.ExpressionExtensions.ExpressionReplacer.ReplaceIn[TExpression](TExpression expression, Func`2 replacer)
   at AgileObjects.AgileMapper.Extensions.Internal.ExpressionExtensions.ExpressionReplacer.Replace(Expression expression)
   at AgileObjects.AgileMapper.Extensions.Internal.ExpressionExtensions.ExpressionReplacer.<ReplaceIn>b__34_0(TryExpression t)
   at AgileObjects.AgileMapper.Extensions.Internal.ExpressionExtensions.ExpressionReplacer.ReplaceIn[TExpression](TExpression expression, Func`2 replacer)
   at AgileObjects.AgileMapper.Extensions.Internal.ExpressionExtensions.ExpressionReplacer.ReplaceIn(TryExpression try)
   at AgileObjects.AgileMapper.Extensions.Internal.ExpressionExtensions.ExpressionReplacer.ReplaceIn(Expression expression)
   at AgileObjects.AgileMapper.Extensions.Internal.ExpressionExtensions.ExpressionReplacer.Replace[TExpression](Expression expression)
   at AgileObjects.AgileMapper.Extensions.Internal.ExpressionExtensions.Replace[TExpression](TExpression expression, ISimpleDictionary`2 replacementsByTarget)
   at AgileObjects.AgileMapper.ObjectPopulation.MappingFactory.GetDirectAccessMapping(Expression mapping, IMemberMapperData mapperData, MappingValues mappingValues, Expression createMappingDataCall)
   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.<AddPopulationsAndCallbacks>b__11_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.<AddPopulationsAndCallbacks>b__11_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 Program.Main()

Darnit! I'll look into it, thanks again for letting me know.

Steve

Darnit! I'll look into it, thanks again for letting me know.

Steve

I feel your pain ^^

This is fixed in the latest 1.7.2 branch code - release to follow.

Thanks again for letting me know! :)

This is fixed in release 1.7.2, which is now on NuGet.

Thanks again!