繁体   English   中英

Automapper-将属性映射到集合

[英]Automapper - map property to collection

源类:

public class ApplicationDriverFormVM
{
    public ApplicationDriverAddressFormVM PresentAddress { get; set; }
    public List<ApplicationDriverAddressFormVM> PreviousAddresses { get; set; }
}

public class ApplicationDriverAddressFormVM
{
    [Required]
    [StringLength(256)]
    [Display(Name = "Address")]
    public string Address { get; set; }
    [Required]
    [StringLength(256)]
    [Display(Name = "City")]
    public string City { get; set; }
    //.....
}

目标类别:

public class ApplicationDriverDomain
{
    public List<ApplicationDriverAddressDomain> Addresses { get; set; }
}

public class ApplicationDriverAddressDomain
{
    public int Id { get; set; }
    public string Address { get; set; }
    public string City { get; set; }
    //....
    public bool IsPresentAddress { get; set; }
}

因此,我想将PresentAddress(一个对象)和PreviousAddresses(集合)映射到Addresses属性(集合),其中每个元素都具有IsPresentAddress属性,如果它被映射为PresentAddress,则应为true,对于PreviousAddresses映射的元素应为false。 我尝试编写这样的地图基本规则:

        CreateMap<ViewModels.ApplicationDriverFormVM, ApplicationDriverDomain>();
        CreateMap<ViewModels.ApplicationDriverAddressFormVM, ApplicationDriverAddressDomain>();

当然,它不能正常工作。 怎么办呢?

这可以通过ForMember扩展方法来完成。

这是一种获取所需内容的快捷方式。 它创建了要映射的ApplicationDriverAddressFormVM的新组合列表,但是如果您浏览文档,则可能会发现一些更优美的内容。

Mapper.CreateMap<ApplicationDriverFormVM, ApplicationDriverDomain>()
    .ForMember(dest => dest.Addresses, opt => opt.MapFrom(src => src.PreviousAddresses.Union(new List<ApplicationDriverAddressFormVM>() { src.PresentAddress })));

Mapper.CreateMap<ApplicationDriverAddressFormVM, ApplicationDriverAddressDomain>();

经过进一步调查,我发现以下方法。 它使用ResolveUsing选项。 同样,这很粗糙,仅使用我发现的第一个功能。 您应该进一步探索IMemberConfigurationExpression接口,并查看还有哪些其他选项

        Mapper.CreateMap<ApplicationDriverFormVM, ApplicationDriverDomain>()
            .ForMember(dest => dest.Addresses, opt => opt.ResolveUsing(GetAddresses));

...

    static object GetAddresses(ApplicationDriverFormVM src)
    {
        var result = Mapper.Map<List<ApplicationDriverAddressDomain>>(src.PreviousAddresses);
        foreach(var item in result)
        {
            item.IsPresentAddress = false;
        }
        var present = Mapper.Map<ApplicationDriverAddressDomain>(src.PresentAddress);
        present.IsPresentAddress = true;
        result.Add(present);

        return result;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM