EmitMapper的使用小结
最近公司开发项目前端使用一个js框架,后端使用ef,js前台读取的json采用实体的dto来进行生成。
在网上看到了EmitMapper相对其他映射框架处理速度可以更快,就拿来用了。下面是代码中常用的几个块。
1.普通的映射。
public class UserInfo { public int id { get; set; } public string name { get; set; } public string address { get; set; } } public class UserInfoDTO { public string name { get; set; } public string address { get; set; } } var mapper = ObjectMapperManager.DefaultInstance.GetMapper<UserInfo, UserInfoDTO>();
UserInfoDTO userdto = mapper.Map(user);
2.有外键关联,需要映射出外键所带名字
public class UserInfo { public int id { get; set; } public string name { get; set; } public string address { get; set; } public Teacher teacher { get; set; } } public class Teacher { public int id { get; set; } public string name { get; set; } } public class UserInfoDTO { public int id { get; set; } public string name { get; set; } public string teacher { get; set; } } var user = new UserInfo { id = 12, name = "张三", address = "北京", teacher = new Teacher { id = 11, name = "王五" } }; var mapper = ObjectMapperManager.DefaultInstance.GetMapper<UserInfo, UserInfoDTO>( new DefaultMapConfig() .ConvertUsing<Teacher, string>(t => t.name) ); UserInfoDTO userdto = mapper.Map(user);
3.两个实体之间名字不一致,需要映射。
public class UserInfo { public int id { get; set; } public string name { get; set; } public string address { get; set; } } public class UserInfoDTO { public int id { get; set; } public string name { get; set; } public string userAddress { get; set; } } var mapper = ObjectMapperManager.DefaultInstance.GetMapper<UserInfo, UserInfoDTO>( new DefaultMapConfig() .MatchMembers((x, y) => { if (x == "address" && y == "userAddress") { return true; } return x == y; }) ); UserInfoDTO userdto = mapper.Map(user);
4.需要对某一个字段进行特殊处理
public class UserInfo { public int id { get; set; } public string name { get; set; } public string address { get; set; } } public class UserInfoDTO { public string id { get; set; } public string name { get; set; } public string userAddress { get; set; } public string userJson { get; set; } } var user = new UserInfo { id = 12, name = "张三", address = "北京" }; var mapper = ObjectMapperManager.DefaultInstance.GetMapper<UserInfo, UserInfoDTO>( new DefaultMapConfig() .PostProcess<UserInfoDTO>((value, state) => { //在id编号前加上今年的年份 value.id = DateTime.Now.ToString("yyyy") + value.id; //实体的json格式 value.userJson = "{\"id\":\"" + value.id + "\",\"name\":\"" + value.name + "\"}"; return value; }) ); UserInfoDTO userdto = mapper.Map(user);
5.忽略掉某个字段的映射
public class UserInfo { public int id { get; set; } public string name { get; set; } public string address { get; set; } } public class UserInfoDTO { public string id { get; set; } public string name { get; set; } public string address { get; set; } } var user = new UserInfo { id = 12, name = "张三", address = "北京" }; var mapper = ObjectMapperManager.DefaultInstance.GetMapper<UserInfo, UserInfoDTO>( new DefaultMapConfig() .IgnoreMembers<UserInfo, UserInfoDTO>(new string[] { "name" }) ); UserInfoDTO userdto = mapper.Map(user);
6.给空元素赋默认值
public class UserInfo { public int id { get; set; } public string name { get; set; } public string address { get; set; } public DateTime? godate { get; set; } } public class UserInfoDTO { public string id { get; set; } public string name { get; set; } public string address { get; set; } public DateTime godate { get; set; } } var user = new UserInfo { id = 12, name = "张三", address = null, godate = null }; var mapper = ObjectMapperManager.DefaultInstance.GetMapper<UserInfo, UserInfoDTO>( new DefaultMapConfig() //如果日期为空设置为当前时间 .NullSubstitution<DateTime?, DateTime>((value) => DateTime.Now) //如果string类型为null赋值为“” .NullSubstitution<string, string>((value) => "") ); UserInfoDTO userdto = mapper.Map(user);
常用的就上面几点,对于更深入的。有待以后研究。。。。。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?