c# - AutoMapper 映射一个子列表对象
问题描述
我正在使用通用方法使用 Automapper 映射两个类
我的通用方法
public class AutoMapperConfiguration
{
public MapperConfiguration Configure<TSource, TDestination>() where TSource:class where TDestination:class
{
var config = new MapperConfiguration(cfg =>
{
cfg.AddProfile<ClientMappingProfile<TSource,TDestination>>();
});
return config;
}
}
ClientMappingProfile.cs
public class ClientMappingProfile<TSource,TDestination>: Profile where TSource : class where TDestination:class
{
public ClientMappingProfile()
{
CreateMap<TSource, TDestination>().ReverseMap();
}
}
StudentDetailsViewModel.cs
public class StudentDetailsViewModel
{
public long ID { get; set; }
public string FirstName { get; set; }
public List<QualificationViewModel> listQualificationViewModel { get; set; }
}
资格视图模型.cs
public class QualificationViewModel
{
public long ID { get; set; }
public long StudentID { get; set; }
public string ExaminationPassed { get; set; }
}
StudentValueObject.cs
public class StudentValueObject
{
public long ID { get; set; }
public string FirstName { get; set; }
public List<StudentQualificationValueObject> listStudentQualificationValueObject { get; set; }
}
StudentQualificationValueObject.cs
public class StudentQualificationValueObject
{
public long ID { get; set; }
public long StudentID { get; set; }
public string ExaminationPassed { get; set; }
}
用法
StudentValueObject studentValueObject = new StudentValueObject();
var config = new AutoMapperConfiguration().Configure<StudentValueObject, StudentDetailsViewModel>();
var iMapper = config.CreateMapper();
studentValueObject = iMapper.Map<StudentDetailsViewModel, StudentValueObject>(objStudentModel);
因此,这适用于 Mapping StudentDetailsViewModel.cs
with StudentValueObject.cs
。但它默默地无法将我的子列表对象复制List<QualificationViewModel>
到List<StudentQualificationValueObject>
. 子列表对象似乎总是null
. 我是 AutoMapper 的新手。我需要一些帮助来了解我哪里出错了或者需要在我的通用方法中添加/修复什么,以便子列表对象与父对象一起复制到。
更新-
目前我正在使用下面的代码并且它工作正常但我很困惑这是这样做的正确方法。
StudentValueObject studentValueObject = new StudentValueObject();
var config = new AutoMapperConfiguration().Configure<StudentValueObject, StudentDetailsViewModel>();
var iMapper = config.CreateMapper();
studentValueObject = iMapper.Map<StudentDetailsViewModel, StudentValueObject>(objStudentModel);
config = new AutoMapperConfiguration().Configure<StudentQualificationValueObject, QualificationViewModel>();
iMapper = config.CreateMapper();
studentValueObject.listStudentQualificationValueObject = iMapper.Map<List<QualificationViewModel>, List<StudentQualificationValueObject>>(objStudentModel.listQualificationViewModel);
解决方案
您必须映射列表属性,因为它们在给定的父类型中具有不同的名称,并且您必须为两个列表中使用的类型添加映射。这是您的代码的工作示例:
public class StudentsMappingProfile : Profile
{
public StudentsMappingProfile()
{
CreateMap<StudentValueObject, StudentDetailsViewModel>()
.ForMember(viewModel => viewModel.listQualificationViewModel, conf => conf.MapFrom(value => value.listStudentQualificationValueObject));
CreateMap<StudentQualificationValueObject, QualificationViewModel>();
}
}
public class Program
{
public static void Main()
{
var config = new MapperConfiguration(cfg => cfg.AddProfile<StudentsMappingProfile>());
var mapper = config.CreateMapper();
var source = new StudentValueObject { ID = 73, FirstName = "Hello", listStudentQualificationValueObject = new List<StudentQualificationValueObject> { new StudentQualificationValueObject { ID = 42, StudentID = 17, ExaminationPassed = "World" } } };
var destination = mapper.Map<StudentDetailsViewModel>(source);
Console.ReadKey();
}
}
推荐阅读
- sorting - 谷歌脚本 - 工作表 - 对多张工作表进行排序 - 无法正常工作
- python - 如何将列表加载到 DataFrame 并迭代 iterrows?
- java - 如何从 xml 字符串的元素中创建变量?
- spring-boot - 客户端确认模式在activemq中不起作用
- architecture - 为对象存储设计微服务架构
- android - Itemviewtype 不适用于 recyclerview 和分页库 2
- database - 在 pgAdmin RDS 数据库中运行 psql 以收集信息?
- wpf - 2个用户控件之间的wpf绑定属性
- r - ggplot2:更改 geom_vline 图例的背景颜色
- tensorflow - 使用 tensorflow 进行 VGG 16 模型训练