Automapper - 多对象源和一个目标

作者:编程家 分类: 编程代码 时间:2025-08-28

Automapper - 多对象源和一个目标

在开发软件时,经常需要将一个对象的数据映射到另一个对象上。这种情况下,使用Automapper库可以极大地简化开发过程。Automapper是一个C#库,它允许我们轻松地实现对象之间的映射,从而减少了手动编写映射代码的工作量。

案例代码

假设我们有两个类,一个是Student,另一个是StudentDto。Student类包含学生的姓名和年龄属性,而StudentDto类包含学生的姓名和年龄的字符串表示。

csharp

public class Student

{

public string Name { get; set; }

public int Age { get; set; }

}

public class StudentDto

{

public string Name { get; set; }

public string Age { get; set; }

}

现在,我们想要将一个Student对象映射到一个StudentDto对象上。使用Automapper,我们只需要在代码中添加映射配置即可。

csharp

var config = new MapperConfiguration(cfg =>

{

cfg.CreateMap()

.ForMember(dest => dest.Age, opt => opt.MapFrom(src => src.Age.ToString()));

});

var mapper = new Mapper(config);

var student = new Student { Name = "John Doe", Age = 20 };

var studentDto = mapper.Map(student);

在上面的代码中,我们创建了一个MapperConfiguration对象,并使用CreateMap方法来定义Student到StudentDto的映射。我们通过使用ForMember方法,指定了Student类中的Age属性应该映射到StudentDto类中的Age属性,并将其转换为字符串表示。

然后,我们创建了一个Mapper对象,并使用Map方法将Student对象映射到StudentDto对象上。最终,我们可以得到一个具有正确映射的StudentDto对象。

更复杂的映射配置

在某些情况下,映射可能更加复杂。例如,如果StudentDto类中有一个Grade属性,它表示学生的年级。我们可以通过使用ResolveUsing方法来解决这个问题。

csharp

public class Student

{

public string Name { get; set; }

public int Age { get; set; }

public int Grade { get; set; }

}

public class StudentDto

{

public string Name { get; set; }

public string Age { get; set; }

public string Grade { get; set; }

}

var config = new MapperConfiguration(cfg =>

{

cfg.CreateMap()

.ForMember(dest => dest.Age, opt => opt.MapFrom(src => src.Age.ToString()))

.ForMember(dest => dest.Grade, opt => opt.ResolveUsing(src =>

{

if (src.Grade <= 3)

return "Primary";

else if (src.Grade <= 6)

return "Intermediate";

else

return "High School";

}));

});

var mapper = new Mapper(config);

var student = new Student { Name = "John Doe", Age = 20, Grade = 5 };

var studentDto = mapper.Map(student);

在上面的代码中,我们添加了一个Grade属性到Student和StudentDto类中。然后,在映射配置中,我们使用ResolveUsing方法来根据学生的年级设置Grade属性的值。根据学生的年级不同,我们可以返回不同的字符串表示。

通过这种方式,我们可以根据不同的映射需求来配置Automapper,从而快速而准确地映射对象。这极大地提高了开发效率,并减少了手动编写映射代码的繁琐过程。