集合中第一项与单个项之间的 AutoMapper 双向映射 属性

AutoMapper bi-directional mapping between first item in collection and single property

我正在使用 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; }
}

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

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

但是,不出所料,如果我随后调用 ReverseMap(),它不知道如何将 EmailAddress1 映射回 EmailAddresses 集合。有什么方法可以让它将 EmailAddress1 映射回 EmailAddress 并将其添加到 EmailAddresses 集合中吗?

我没有在 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.EmailAddresses 映射到 Destination.EmailAddresses,然后 Destination.EmailAddresses 完成映射到 EmailAddress1 的工作。这并不理想,因为我不得不公开电子邮件地址的集合 属性 除了自动映射器之外我不想被任何人使用,但它完成了。