考虑以下类:
public class Colli
{
public int Count { get; set; }
public string Description { get; set; }
}
public class Shipment
{
public List<Colli> Collis { get; set; }
}
public class ShipmentDto
{
public List<ColliDto> Collis { get; set; }
}
public class ColliDto
{
public string Description { get; set; }
}
我希望Colli
s的列表基于Colli
的Count
生成具有相同描述的ColliDto
s的新列表。
JSON中期望的输入/输出示例:
{
"collis": [
{
"count": 2,
"description": "Colli 1"
},
{
"count": 1,
"description": "Colli 2"
}
]
}
{
"collis": [
{
"description": "Colli 1"
},
{
"description": "Colli 1"
},
{
"description": "Colli 2"
}
]
}
(真正的类有更多的字段—这只是一个最小的工作示例)
我的研究表明,使用ITypeConverter
应该可以解决这个问题,我尝试创建以下内容:
public class ColliConverter : ITypeConverter<Colli, List<ColliDto>>
{
public List<ColliDto> Convert(Colli source, List<ColliDto> destination, ResolutionContext context)
{
var retval = new List<ColliDto>();
for (int i = 0; i < source.Count; i++)
{
retval.Add(context.Mapper.Map<ColliDto>(source));
}
return retval;
}
}
使用以下映射配置文件:
CreateMap<Colli, List<ColliDto>>().ConvertUsing<ColliConverter>();
但是,在转换器类中设置断点告诉我它没有被使用。
这可以用AutoMapper完成吗?还是我应该走"老路线",手工映射这个类?
解决方案1
- 创建
ShipmentConverter
类型转换器,用于从Shipment
对象映射到ShipmentDto
对象。
public class ShipmentConverter : ITypeConverter<Shipment, ShipmentDto>
{
public ShipmentDto Convert(Shipment source, ShipmentDto destination, ResolutionContext context)
{
destination = new ShipmentDto();
destination.Collis = new List<ColliDto>();
foreach (var colli in source.Collis)
{
for (int i = 0; i < colli.Count; i++)
{
destination.Collis.Add(context.Mapper.Map<ColliDto>(colli));
}
}
return destination;
}
}
Shipment
的映射配置文件
CreateMap<Colli, ColliDto>();
CreateMap<Shipment, ShipmentDto>()
.ConvertUsing<ShipmentConverter>();
演示方案1 @ .NET Fiddle
解决方案2
- 创建
ColliListConverter
类型转换器,用于从Colli
列表映射到ColliDto
列表。
public class ColliListConverter : ITypeConverter<List<Colli>, List<ColliDto>>
{
public List<ColliDto> Convert(List<Colli> source, List<ColliDto> destination, ResolutionContext context)
{
var retval = new List<ColliDto>();
foreach (var colli in source)
{
for (int i = 0; i < colli.Count; i++)
{
retval.Add(context.Mapper.Map<ColliDto>(colli));
}
}
return retval;
}
}
Shipment
的映射配置文件
cfg.CreateMap<Colli, ColliDto>();
cfg.CreateMap<List<Colli>, List<ColliDto>>()
.ConvertUsing<ColliListConverter>();
cfg.CreateMap<Shipment, ShipmentDto>();
演示方案2 @ .NET Fiddle