Я пытаюсь преобразовать два свойства исходной коллекции различных типов в одно и то же свойство коллекции целевого типа.
Существует преобразование между моими типами источников и типом элементов целевой коллекции.
Проблема в том, что код MapFrom
фактически не устанавливает свойство назначения.
Я использую Autopper 8.
Это минимальный пример моей проблемы.
Источник
public class SourceWithDict
{
public List<HasLabel> Prop1 { get; } = new List<HasLabel>();
public List<HasName> Prop2 { get; } = new List<HasName>();
}
public class HasLabel
{
public string Label { get; set; }
}
public class HasName
{
public string Name { get; set; }
}
Пункт назначения
public class DestinationDict
{
public List<string> Prop1And2 { get; } = new List<string>();
}
Mapping
ForAllPropertyMaps(pm => pm.DestinationName != "DictWithoutUseDestinationValue",
(map, expression) => expression.UseDestinationValue());
CreateMap<HasLabel, string>()?.ConvertUsing(label => label.Label);
CreateMap<HasName, string>()?.ConvertUsing(name => name.Name);
CreateMap<SourceWithDict, DestinationDict>()
?.ForMember(dest => dest.Prop1And2, o =>
{
o.MapFrom((source, destination, member, context) =>
{
// this seems to set Prop1And2 correctly during debugging, but the mapped result is empty
destination.Prop1And2.AddRange(context.Mapper.Map<List<string>>(source.Prop1));
destination.Prop1And2.AddRange(context.Mapper.Map<List<string>>(source.Prop2));
member = destination.Prop1And2;
return destination.Prop1And2;
});
});
Тестовый код
[Test]
public void Mapping_merged_Properties()
{
var source = new SourceWithDict();
var hasLabel = new HasLabel() {Label = "abba"};
source.Prop1.Add(hasLabel);
var hasName = new HasName() {Name = "doch"};
source.Prop2.Add(hasName);
var mapped = Mapper.Map<DestinationDict>(source);
// this fails, because mapped.Prop1And2 remains empty
Assert.That(mapped.Prop1And2, Has.Count.EqualTo(2).And.EquivalentTo(new [] {"abba","doch"}));
}