0

我正在使用 AutoMapper 6。考虑以下类:

public class Source
{
    public FlattenableClass Flattenable { get; set; }

    public List<EmailAddress> EmailAddresses { get; set; }
}

public class Destination
{
    public string FlattenableProp1 { get; set; }

    public string FlattenableProp2 { get; set; }

    public MappedEmailAddress EmailAddress1 { get; set; }
}

where有名为andFlattenableClass的属性。如您所见,源有一个集合,但目标只需要第一个,因为虽然我们的数据库允许电子邮件地址的集合,但应用程序将支持一个。我相信我可以像这样安排这个映射:Prop1Prop2EmailAddressSourceDestination

CreateMap<Source, Destination>()
    .ForMember(d => d.EmailAddress1, opt => opt.ResolveUsing(s => s.EmailAddresses?.FirstOrDefault()));

但是,不出所料,如果我再调用ReverseMap()它,它不知道如何映射EmailAddress1EmailAddresses集合。有没有办法让它映射EmailAddress1回一个EmailAddress并将其添加到EmailAddresses集合中?

4

1 回答 1

0

我没有在 AutoMapper 中找到任何支持,但我找到了解决方法。我刚刚在源中创建了一个目标属性来为我完成工作:

public class Destination
{
    public string FlattenableProp1 { get; set; }

    public string FlattenableProp2 { get; set; }

    public MappedEmailAddress EmailAddress1 { get; set; }

    public List<MappedEmailAddress> EmailAddresses
    {
        get
        {
            List<MappedEmailAddress> emails = new List<MappedEmailAddress>();
            if (EmailAddress1 != null) emails.Add(EmailAddress1);

            return emails;
        }
        set
        {
            if (value == null || value.Count == 0)
                EmailAddress1 = new MappedEmailAddress();
            else
                EmailAddress1 = value[0];
        }
    }
}

这让 AutoMapper 映射Source.EmailAddressesDestination.EmailAddresses,然后Destination.EmailAddresses执行映射到EmailAddress1. 这并不理想,因为我必须公开电子邮件地址属性的集合,除了自动映射器,我不想被任何人使用,但它可以完成它。

于 2017-10-25T21:05:30.410 回答