Automapper 自定义解析器源成员到目标对象列表映射问题

Posted

技术标签:

【中文标题】Automapper 自定义解析器源成员到目标对象列表映射问题【英文标题】:Auto mapper Custom resolver source members to destination object list mapping issue 【发布时间】:2020-10-15 17:02:38 【问题描述】:

场景如下:

源对象:

公共类 personSrc

    公共字符串名称 get;放;
    公共字符串电话get;放;
    公共字符串 HomeAddress get;放;
    公共字符串 OfficeAddress get;放;

目标对象:

公开课 personDest

    公共字符串名称 get;放;
    公共字符串电话get;放
    公共列表 地址 get;放;


公开课地址

    公共字符串位置 get;放;
    公共地址类型类型 get;放;

公共枚举地址类型 办公室,家庭

所以为了将地址成员从源映射到目标,我制作了这个自定义解析器:

公共类 CustomResolver : IValueResolver>

  public List Resolve(personSrc source, personDest destination, List destMember, ResolutionContext context)
  
    列表 结果 = 新列表();
    if(!String.IsNullOrEmpty(source.HomeAddress))
    
       结果.add(新地址
         位置 = source.HomeAddress,
         类型 = addressType.Home
       );
    
    if(!String.IsNullOrEmpty(source.OfficeAddress))
    
       结果.add(新地址
         位置 = source.OfficeAddress,
         类型 = addressType.Office
       );
    
    返回结果;
  


我面临的问题是,当我定义我这样编写的探查器时,我似乎无法通过 personSrc 类:

CreateMap()
    .ForMember(dest => dest.name, opt => opt.MapFrom(src => src.name))
    .ForMember(dest => dest.phone, opt => opt.MapFrom(src => src.phone))
    .ForMember(dest => dest.addresses, opt => opt.MapFrom(src => src) // 这行不工作
    .ForMember(dest => dest.addresses, opt => opt.MapFrom() // 这行也不行

很可能我的个人资料没有正确实施,但我似乎找不到正确实施的示例。

【问题讨论】:

【参考方案1】:

您的个人资料是正确的。我已经尝试了您的示例,并且设法将值映射到您的目标类,并且您的个人资料应如下所示:

public class CustomProfiler : Profile
  
    /// <summary>
    /// Initializes a new instance of the <see cref="CustomerProfile"/> class.
    /// </summary>
    public CustomProfiler()
    
      CreateMap<personSrc, personDest>()
     .ForMember(dest => dest.name, opt => opt.MapFrom(src => src.name))
     .ForMember(dest => dest.phone, opt => opt.MapFrom(src => src.phone))
     .ForMember(dest => dest.addresses, opt => opt.MapFrom<CustomResolver>());
    
  

我已经用例子试过了:

var personSrc = new personSrc  HomeAddress = "HomeAddress", OfficeAddress = "OfficeAddress", name = "name", phone = "phone" ;
      var personDest = mapper.Map<personDest>(personSrc);

你在正确的轨道上。你可以试试,让我知道这是否适合你?

【讨论】:

是的,我为 IValueResolver 创建一个与 Automapper 接口冲突的接口搞砸了

以上是关于Automapper 自定义解析器源成员到目标对象列表映射问题的主要内容,如果未能解决你的问题,请参考以下文章

Automapper 忽略 null 值,但将空字符串映射到 null

ASP.NET Core 中的对象映射之 AutoMapper

AutoMapper的介绍与使用

0.AutoMapper

在Mapping时向Automapper提供构造函数参数

如何调试到 AutoMapper 代码?