C# 自动映射子列表对象

C# 自动映射子列表对象,c#,asp.net-mvc,asp.net-mvc-5,automapper-6,C#,Asp.net Mvc,Asp.net Mvc 5,Automapper 6,我使用一个通用方法来映射两个使用Automapper的类 我的泛型方法 public class AutoMapperConfiguration { public MapperConfiguration Configure<TSource, TDestination>() where TSource:class where TDestination:class { var config = new MapperConfiguration(cfg =&g

我使用一个通用方法来映射两个使用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;
    }
}
StudentValueObject.cs

public class StudentValueObject
{
    public long ID { get; set; }
    public string FirstName { get; set; }
    public List<StudentQualificationValueObject> listStudentQualificationValueObject { get; set; }
}
public class StudentQualificationValueObject
{
    public long ID { get; set; }
    public long StudentID { get; set; }
    public string ExaminationPassed { get; set; }
}
用法


必须映射列表属性,因为它们在给定的父类型中具有不同的名称,并且必须为两个列表中使用的类型添加映射。以下是代码的工作示例:

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();
    }
}
public class StudentsMappingProfile:Profile
{
公共学生管理档案()
{
CreateMap()
.ForMember(viewModel=>viewModel.listQualificationViewModel,conf=>conf.MapFrom(value=>value.listStudentQualificationValueObject));
CreateMap();
}
}
公共课程
{
公共静态void Main()
{
var config=new-MapperConfiguration(cfg=>cfg.AddProfile());
var mapper=config.CreateMapper();
var source=new StudentValueObject{ID=73,FirstName=“Hello”,listsudentqualificationvalueobject=new List{new StudentQualificationValueObject{ID=42,StudentID=17,testationpassed=“World”};
var destination=mapper.Map(源);
Console.ReadKey();
}
}

您的配置需要包含如何从
StudentQualificationValueObject
映射到
QualificationViewModel
的定义。否则它不知道如何转换这些类型,但您不需要为集合定义转换,只需为类型本身定义转换。请参阅我的更新。谢谢Oliver。现在开始工作了。如果我们将类作为参数传递,它应该自动映射子对象,那么我们是否可以使它更通用。此外,它还处理空对象。我在开始时也尝试过这种通用方法。不幸的是,它不能很好地工作,因为在对象树映射中,几乎总是有一些特殊的处理。IMHO创建配置文件(就像我在回答中所做的那样)并从不同的配置文件创建映射器效果更好。是的,在使其更通用的同时面临相同的问题。因此,我们必须采用创建不同的配置文件的方法。
public class StudentValueObject
{
    public long ID { get; set; }
    public string FirstName { get; set; }
    public List<StudentQualificationValueObject> listStudentQualificationValueObject { get; set; }
}
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);
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();
    }
}