DotNet AutoMap映射扩展,免去每次每次定义转换规则

server/2025/2/27 7:10:06/

传统的AutoMap需要给每一个转换定义规则,如果有很多实体就会很麻烦,所以做了一个扩展类用来简化步骤

使用

//使用
实体1的结果.MapTo<实体2>();//例如 有两个实体
public class User
{public int Id { get; set; }
}
public class UserDto
{public int Id { get; set; }
}
//转换
var user=new User(){Id=1};
user.MapTo<UserDto>();//定制规则
user.MapTo<User, UserDto>(opts =>
{//转换前opts.BeforeMap((src, dest) =>{dest.Id = src.Id;});//转换后opts.AfterMap((src, dest) =>{dest.Id = src.Id;});
});

扩展类

using AutoMapper;
using System.Collections.Concurrent;namespace Easy.Common.Core
{/// <summary>/// automap扩展类/// </summary>public static class AutoMapperExtensions{private static readonly ConcurrentDictionary<string, IMapper> MapperCache = new ConcurrentDictionary<string, IMapper>();private static IMapper GetOrCreateMapper(Type sourceType, Type destinationType){var key = $"{sourceType.FullName}_{destinationType.FullName}";if (!MapperCache.TryGetValue(key, out var mapper)){var config = new MapperConfiguration(cfg =>{cfg.CreateMap(sourceType, destinationType);});mapper = config.CreateMapper();MapperCache[key] = mapper;}return mapper;}/// <summary>/// 实体转换/// </summary>/// <typeparam name="TDestination"></typeparam>/// <param name="source"></param>/// <returns></returns>public static TDestination MapTo<TDestination>(this object source){var mapper = GetOrCreateMapper(source.GetType(), typeof(TDestination));return mapper.Map<TDestination>(source);}/// <summary>/// 列表转换/// </summary>/// <typeparam name="TSource"></typeparam>/// <typeparam name="TDestination"></typeparam>/// <param name="source"></param>/// <returns></returns>public static List<TDestination> MapListTo<TSource, TDestination>(this object source){var mapper = GetOrCreateMapper(source.GetType(), typeof(TDestination));return mapper.Map<List<TDestination>>(source);}/// <summary>/// 扩展转换,指定某些字段转换规则/// </summary>/// <typeparam name="TSource"></typeparam>/// <typeparam name="TDestination"></typeparam>/// <param name="source"></param>/// <param name="opts"></param>/// <returns></returns>public static TDestination MapTo<TSource, TDestination>(this TSource source, Action<IMappingOperationOptions<TSource, TDestination>> opts){var mapper = GetOrCreateMapper(typeof(TSource), typeof(TDestination));return mapper.Map(source, opts);}}
}

http://www.ppmy.cn/server/170966.html

相关文章

国产超强开源大语言模型 DeepSeek-R1-70B 一键部署教程

DeepSeek-R1-Distill-Llama-70B 是深度求索 (DeepSeek) 公司于 2025 年推出的开源大语言模型&#xff0c;参数规模高达 700 亿。它是基于 Llama3.3-70B-Instruct 进行训练的&#xff0c;采用强化学习和蒸馏技术提升推理表现&#xff0c;不仅继承了 Llama 系列模型的优势&#x…

网络渗透作业

第一题&#xff1a;使用Xpath对Order by 语句进行布尔盲注 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml&quo…

Unity Shader 学习13:屏幕后处理 - 使用高斯模糊的Bloom辉光效果

目录 一、基本的后处理流程 - 以将画面转化为灰度图为例 1. C#调用shader 2. Shader实现效果 二、Bloom辉光效果 1. 主要变量 2. Shader效果 &#xff08;1&#xff09;提取较亮区域 - pass1 &#xff08;2&#xff09;高斯模糊 - pass2&3 &#xff08;3&#xff…

每日一题——LRU缓存机制的C语言实现详解

LRU缓存机制的C语言实现详解 参考1. 数据结构设计双向链表节点哈希表节点哈希表LRU缓存结构 2. 初始化哈希表和双向链表哈希函数初始化哈希表初始化双向链表创建LRU缓存 3. 更新双向链表4. 实现Get操作5. 实现Put操作更新节点值删除最久未使用节点插入或更新节点 6. 释放缓存释…

内容中台的企业CMS架构是什么?

企业CMS模块化架构 现代企业内容管理系统的核心在于模块化架构设计&#xff0c;通过解耦内容生产、存储、发布等环节构建灵活的技术栈。动态/静态发布引擎整合技术使系统既能处理实时更新的产品文档&#xff0c;也能生成高并发的营销落地页&#xff0c;配合版本控制机制确保内…

20.<Spring图书管理系统①(登录+添加图书)>

PS&#xff1a;关于接口定义 接口定义&#xff0c;通常由服务器提供方来定义。 1.路径&#xff1a;自己定义 2.参数&#xff1a;根据需求考虑&#xff0c;我们这个接口功能完成需要哪些信息。 3.返回结果&#xff1a;考虑我们能为对方提供什么。站在对方角度考虑。 我们使用到的…

JAVA面试常见题_基础部分_springboot面试题

问题一 什么是 Spring Boot&#xff1f; 多年来&#xff0c;随着新功能的增加&#xff0c;spring 变得越来越复杂。只需访问 https://spring.io/projects 页面&#xff0c;我们就会看到可以在我们的应用程序中使用的所有 Spring 项目的不同功能。如果必须启动一个新的 Sprin…

C++ STL(二)deque

目录 deque&#xff08;双端队列&#xff09; 内存结构 验证地址不连续 使用详解 构造函数 元素访问 容量操作 修改 迭代器 迭代器失效 code实例 实现一个简单的deque deque&#xff08;双端队列&#xff09; std::deque&#xff08;双端队列&#xff09;是 C 标准…