AutoMapper - 将 HTTP 响应扁平化为我想要的类

问题描述 投票:0回答:2

我有模型类,我的 HTTP 响应将被反序列化。

public class Contract
{
    public IEnumerable<InnerClass> MyConfig { get; set; }
}

public class InnerClass
{
    public int Id { get; set; }
    public string Value { get; set; }
}

我想将其映射到更扁平的类

public class MyClass
{
    public int IdWithDifferentName { get; set; }
    public string ValueWithDifferentName { get; set; }
}

我的挑战是响应是一个数组,所以有效地我得到了

IEnumberable<Contract>
,然后我想将其映射到
IEnumerable<MyClass>
,它应该包含所有
InnerClass
值,无论它来自哪个
Contract
实例.

我需要在 AutoMapper 中做什么才能使其正常工作?

这就是我调用 AutoMapper 的方式:

var configs = _mapper.Map<IEnumerable<MyClass>>(response);
c# automapper
2个回答
1
投票

如果您希望在 AutoMapper 映射配置文件/规则中实现转换逻辑,您需要:

  1. InnerClass
    MyClass
    的映射规则。

  2. Contract
    IEnumerable<MyClass>
    的映射规则。

  3. IEnumerable<Contract>
    IEnumerable<MyClass>
    的映射规则。

CreateMap<InnerClass, MyClass>()
    .ForMember(dest => dest.IdWithDifferentName, opt => opt.MapFrom(src => src.Id))
    .ForMember(dest => dest.ValueWithDifferentName, opt => opt.MapFrom(src => src.Value));

CreateMap<Contract, IEnumerable<MyClass>>()
    .ConvertUsing((src, dest, context) => context.Mapper.Map<IEnumerable<MyClass>>(src.MyConfig));

CreateMap<IEnumerable<Contract>, IEnumerable<MyClass>>()
    .ConvertUsing((src, dest, context) => src.SelectMany(x => context.Mapper.Map<IEnumerable<MyClass>>(x.MyConfig)));

参考:自定义类型转换器


0
投票

经过大量使用聊天 GPT(以及大量的试验和错误)后,我们找到了一个可行的解决方案。

我需要制作一张从

InnerClass
MyClass
的常规基本地图,然后将我调用它的方式更改为

var configs = response.SelectMany(c => c.MyConfig).Select(inner => _mapper.Map<MyClass>(inner));

然后就成功了

© www.soinside.com 2019 - 2024. All rights reserved.