求不使用AutoMapper实现Student与StudentDTO的对象映射方法
手动实现Student与StudentDTO的对象映射(不依赖AutoMapper)
没问题,咱们完全可以手动编写映射逻辑来完成这两个类之间的转换,不需要依赖AutoMapper这类第三方库。手动映射的好处是逻辑完全可控,也不会引入额外的依赖。
首先得补充一下你没给出的Faculty和FacultyDTO类的定义(毕竟你的Student类里用到了这两个嵌套对象),假设它们的结构是这样的:
// 原实体类的枚举 public enum Faculty { ComputerScience, Mathematics, Physics } // DTO类的枚举 public enum FacultyDTO { ComputerScience, Mathematics, Physics }
接下来,咱们可以用扩展方法来实现双向转换,这种方式调用起来会更优雅:
public static class StudentMappingExtensions { // 将Student转换为StudentDTO public static StudentDTO ToStudentDTO(this Student student) { if (student == null) return null; return new StudentDTO { Name = student.Name, Id = student.Id, // 因为两个枚举的成员名称一致,直接强制转换即可 FacultyName = (FacultyDTO)Enum.Parse(typeof(FacultyDTO), student.FacultyName.ToString()) }; } // 将StudentDTO转换为Student public static Student ToStudent(this StudentDTO studentDto) { if (studentDto == null) return null; var student = new Student { Name = studentDto.Name, Id = studentDto.Id, FacultyName = (Faculty)Enum.Parse(typeof(Faculty), studentDto.FacultyName.ToString()) }; // Student类的hw方法是实例方法,创建对象后自动拥有,无需额外处理 // 内部类many属于Student的私有结构,DTO中没有对应,也不需要处理 return student; } }
调用示例
使用的时候就像调用类的原生方法一样简单:
// 创建一个Student实例 var originalStudent = new Student { Name = "Srikanth", Id = 1001, FacultyName = Faculty.ComputerScience }; // 转成StudentDTO var studentDto = originalStudent.ToStudentDTO(); // 再转回Student var convertedStudent = studentDto.ToStudent();
额外注意点
- 如果
Faculty和FacultyDTO的枚举成员名称不一致,你需要用switch-case手动对应映射关系,避免转换出错 - 一定要处理null值,防止空引用异常
- 后续如果类的属性有增减,记得同步更新映射方法里的逻辑
内容的提问来源于stack exchange,提问作者Srikanth Rokkam
相关产品推荐
相关产品推荐

