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

标签 c# .net automapper automapper-9

场景如下:

源对象:

public class personSrc
{
    public string name {get; set;}
    public string phone {get; set;}
    public string HomeAddress {get; set;}
    public string OfficeAddress {get; set;}
}

目标对象:

public class personDest
{
    public string name {get; set;}
    public string phone {get; set}
    public List<address> addresses {get; set;}
}

public class address
{
    public string location {get; set;}
    public addressType type {get; set;}
}
public enum addressType {Office, Home}

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

public class CustomResolver : IValueResolver<personSrc, personDest, List<address>>
{
  public List<address> Resolve(personSrc source, personDest destination, List<address> destMember, ResolutionContext context)
  {
    List<address> result = new List<adress>();
    if(!String.IsNullOrEmpty(source.HomeAddress))
    {
       result.add(new Address{
         location = source.HomeAddress,
         type = addressType.Home
       });
    }
    if(!String.IsNullOrEmpty(source.OfficeAddress))
    {
       result.add(new Address{
         location = source.OfficeAddress,
         type = addressType.Office
       });
    }
    return result;
  }
}

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

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>(src => src) // this line is not working
    .ForMember(dest => dest.addresses, opt => opt.MapFrom<customResolver>() // this line is also not working

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

最佳答案

您的个人资料正确。我已经尝试过您的示例,并且已成功获取映射到您的目标类的值,并且您的个人资料应如下所示:

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);

你走在正确的道路上。您可以尝试一下并告诉我这是否适合您吗?

关于c# - Automapper 自定义解析器源成员到目标对象列表映射问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62571951/

相关文章:

c# - 如何在自动映射器中使用模式映射源和目的地?

c# - 我在使用 C# 对象初始值设定项时做错了什么?

c# - 无法将类型为 'System.Int32' 的对象转换为 DataReader.GetString() 中的类型 'System.String'

.net - .NET 中的本地化地区/国家名称

c# - 自动递增数字的最佳实践 EF Core

c# - AutoMapper 2.1.265 中缺少成员

c# - 将构造函数参数从接口(interface)类型转换为具体类类型在这里是错误的吗?

c# - XNA 中的彩色单像素

.NET "default line terminator"?

c# - .NET 4.5 中的任务与线程