Объединить различные типы источников в коллекцию одного и того же типа назначения - PullRequest
0 голосов
/ 07 марта 2019

Я пытаюсь преобразовать два свойства исходной коллекции различных типов в одно и то же свойство коллекции целевого типа. Существует преобразование между моими типами источников и типом элементов целевой коллекции.

Проблема в том, что код 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"}));
}
...