惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Jina AI
Jina AI
Hugging Face - Blog
Hugging Face - Blog
博客园 - 三生石上(FineUI控件)
博客园 - 【当耐特】
大猫的无限游戏
大猫的无限游戏
IT之家
IT之家
宝玉的分享
宝玉的分享
WordPress大学
WordPress大学
有赞技术团队
有赞技术团队
Apple Machine Learning Research
Apple Machine Learning Research
酷 壳 – CoolShell
酷 壳 – CoolShell
阮一峰的网络日志
阮一峰的网络日志
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
爱范儿
爱范儿
小众软件
小众软件
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The Cloudflare Blog
S
SegmentFault 最新的问题
博客园 - Franky
博客园_首页
T
Tailwind CSS Blog
雷峰网
雷峰网
罗磊的独立博客

博客园 - 郎中令

锦衣夜行,AI乐园 Redis实战:用缓存为数据库减负(二) Redis初体验: 搭建与简单应用(一) .Net Core的SwaggerUI接口分类+固定路由 真实性编码:配置NLog日志+Seq分布式 防御性编码:手搓NLog日志+Seq分布式 对接Java所谓的DES加解密 人大金仓数据库转换 人大金仓踩坑指南 RSA加解密笔记 HTTPS请求笔记- SSL安全通道验证问题 .NetCore打包部署(DLL) SM4算法快速预览与Framework4.5版本对接 简易首页防暴力-字典计时器 vite运行打包前端-部署Linux 记一次线上数据库异常的协助排查 降本增笑:记一次首页并发白屏优化过程 solr 基础介绍以及踩坑日记 动态展示缩放背景图
字典映射处理
郎中令 · 2024-07-08 · via 博客园 - 郎中令

     正常情况下不同的终端在进行接口对接时会对传输的数据进行加密,在解密之后拿到字符串,要么直接用动态类型获取,但是又要对字段进行判空校验,非常麻烦,这里封装了实体映射的方法,直接把解密后的字符串进行解析,映射到对应的实体对象中,其中是包括单实体,以及包含带子表的实体映射。 如下

        #region 字段映射

        /// <summary>
        /// 字段映射 解密映射实体
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="input"></param>
        /// <returns></returns>
        public static T MapEntity<T>(this string input) where T : new()
        {
            T entity = new T();
//带正则表达式解析,没有可不要 MatchCollection matches
= Regex.Matches(input, @"<(\w+):([^<>]+)>"); foreach (Match match in matches) { string key = match.Groups[1].Value; string value = match.Groups[2].Value; SetNullFieldData(key, value, entity); } return entity; } /// <summary> /// 字段映射 解密映射实体 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="input"></param> /// <returns></returns> public static T MapEntityV2<T, U>(this string input, string detailName) where T : new() where U : new() { T entity = new T();
//带正则表达式解析,没有可不要 MatchCollection matches
= Regex.Matches(input, @"<(\w+):(.+?)>"); foreach (Match match in matches) { string key = match.Groups[1].Value; string value = match.Groups[2].Value; if (key == detailName) { // 解析子表数据 var subTableData = value.Split(';'); List<U> subTableEntities = new List<U>(); foreach (var subData in subTableData) { var subDataParts = subData.Split(','); U subTableEntity = new U(); foreach (var part in subDataParts) { var subParts = part.Split(':'); string subKey = subParts[0]; string subValue = subParts[1]; SetNullFieldData(subKey, subValue, subTableEntity); } subTableEntities.Add(subTableEntity); } // 将子表数据映射到主实体对象的属性中 var property = typeof(T).GetProperty(key); if (property != null) { property.SetValue(entity, subTableEntities); } } else { // 解析主表数据 SetNullFieldData(key, value, entity); } } return entity; } private static void SetNullFieldData<T>(string key, string value, T entity) { var property = typeof(T).GetProperty(key); if (property == null) { return; } if (property.PropertyType == typeof(int?) && int.TryParse(value, out int parsedValue)) { property.SetValue(entity, parsedValue); } else if (property.PropertyType == typeof(long?) && long.TryParse(value, out long longValue)) { property.SetValue(entity, longValue); } else if (property.PropertyType == typeof(short?) && short.TryParse(value, out short shortValue)) { property.SetValue(entity, shortValue); } else { property.SetValue(entity, Convert.ChangeType(value, property.PropertyType)); } } #endregion