我有模型类,我的 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);
如果您希望在 AutoMapper 映射配置文件/规则中实现转换逻辑,您需要:
InnerClass
到MyClass
的映射规则。
Contract
到IEnumerable<MyClass>
的映射规则。
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)));
参考:自定义类型转换器
经过大量使用聊天 GPT(以及大量的试验和错误)后,我们找到了一个可行的解决方案。
我需要制作一张从
InnerClass
到MyClass
的常规基本地图,然后将我调用它的方式更改为
var configs = response.SelectMany(c => c.MyConfig).Select(inner => _mapper.Map<MyClass>(inner));
然后就成功了