C#中,不同命名空间下面完全相同的类对象进行赋值

背景前提:

1、在命名空间ModelA、ModelB下,都有完全相同的类定义ClassX、ClassY、ClassZ ;

2、ClassBase是父类,它的子类有:ClassX、ClassY、ClassZ 

3、在ModelB下不能访问ModelA;

4、有大量文件,每个文件里都是ModelA下的ClassX、ClassY、ClassZ中某些类型的数据(格式是json);

要求目标:

读取这些文件的数据后,完全赋值给ModelB下对应的类

处理思路:

读取文件json字符串后替换$type标记的数据类型,再将json反序列化赋值给ModelB对应的类对象 

        //step1先进行反射,得到ModelA下的所有类型 static bool GetTypeByString(out List<Type> types) {string dll = AppDomain.CurrentDomain.BaseDirectory + $"\\ModelA.dll";Assembly assembly = Assembly.LoadFrom(dll);types = assembly.GetTypes().Where(x => x.FullName.StartsWith("ModelA ")).ToList();return types.Count > 0;}
                //step2 将json替换成JObject对象JObject jObject = JObject.Parse(json);foreach (JProperty property in jObject.Properties()) {if (property.Value.Type == JTokenType.Object) {ModifyTypeProperty(property.Value as JObject); }else if (property.Value.Type == JTokenType.Array){foreach (JObject itemJobect in (property.Value as JArray).Children<JObject>()){ModifyTypeProperty(itemJobect);}}}

        //step3 替换JObject对象的$type属性对应的信息static void ModifyTypeProperty(JObject jsonObject) {JProperty property = jsonObject.Property("$type");if (property != null) {string originalTypeName = property.Value.ToString();//完整的限定名,程序集的简单名称或完整名称 string[] arr = originalTypeName.Split(',');string typename = arr[0].Substring(arr[0].LastIndexOf('.') + 1);var findType = types.Find(x => x.Name == typename);if (findType == null) {throw new Exception($"没有找到类型:{typename}");}string modifiedType = $"{findType.FullName},{findType.Assembly.GetName().Name}";property.Value = modifiedType;}foreach (JProperty jProperty in jsonObject.Properties()) {if (jProperty.Value.Type == JTokenType.Object) {ModifyTypeProperty(jProperty.Value as JObject);}}}
//step4 处理过的jObject对象,转回Json字符串var newJson = jObject.ToString();

               //step5 对新得到的json字符串,反序列化到ModelB下的类对象JsonSerializerSettings setting = new JsonSerializerSettings(){TypeNameHandling = TypeNameHandling.Auto,};var inpara = new { FGuid = Guid.Empty, listTc  = new List<ClassX>(), listTm  = new List<ClassY>() };inpara = JsonConvert.DeserializeAnonymousType(newJson, inpara, setting);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/43401.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端笔记-day13

文章目录 01-体验vw和vh02-vw适配02-适配.htmldemo.lessdemo.css 03-vw和vh不能混用03-vw和vh.htmldemo.lessdemo.css 04-综合案例-酷我demo.htmldemo.lessbase.lessdemo.css 酷我&#xff08;标准版&#xff09;index.htmlindex.lessindex.css 01-体验vw和vh <!DOCTYPE ht…

记一次线上流量突增问题排查

一.问题 接流量告警出现获取 xx 信息接口调用次数同比往年大促活动猛涨.扩大至 10 倍之多.心里顿时咯噔一下.最近各种严打,顶风作案.某不是摸到电门了.一下子要把自己带走.从此走向求职之路.一时间脑子哇哇的思绪万千. 202x.5.20 大促开门红的调用.这个是往年活动的时候的调用…

如何在 Odoo 16 中生成 CSV 报告

在 Odoo 中&#xff0c;我们需要生成多种类型的文件以用于不同的目的。CSV 报告允许用户从 Odoo 数据库导出结构化数据。CSV 格式受到各种应用程序和工具的广泛支持&#xff0c;因此可以轻松地与外部系统&#xff08;如电子表格&#xff08;例如 Microsoft Excel、Google Sheet…

铁威马NAS教程丨为什么修复文件系统、为卷扩容、增加及删除 SSD 缓存等操作失败?

适用机型&#xff1a; 所有 TNAS 型号 适用版本&#xff1a; 所有 TOS 版本 问题现象&#xff1a; 在尝试修复文件系统、为卷扩容、增加或删除 SSD 缓存时(TOS 5)&#xff0c;可能因卷被其他进程占用而操作失败。 解决方法&#xff1a; 为了成功执行上述操作&#xff0c;您…

谷歌云 | Gemini 大模型赋能 BigQuery 情感分析:解码客户评论,洞悉市场风向

情感分析是企业洞察客户需求和改进产品服务的重要工具。近年来&#xff0c;随着自然语言处理 (NLP) 技术的飞速发展&#xff0c;情感分析变得更加精准高效。Google 推出的 Gemini 模型&#xff0c;作为大型语言模型 (LLM) 的代表&#xff0c;拥有强大的文本处理能力&#xff0c…

生成图质量评价

1. RichHF-18K 论文地址 解决问题&#xff1a; 如何对生成图质量进行算法评价&#xff0c;以优化图片质量&#xff0c;提升模型生成能力 解决思路&#xff1a; 参考多模态模型&#xff0c;构建评价模型&#xff0c;从7个维度分三个分支对生成图进行测评&#xff1a; Tips&…

Python + 读取 / 写入视频

读取并播放视频 这篇教学会介绍OpenCV 里的VideoCapture() 方法&#xff0c;透过这个方法&#xff0c;读取电脑中的视频&#xff0c;或开启电脑的摄影镜头读取视频画面。 因为程式中的OpenCV 会需要使用镜头或GPU&#xff0c;所以请使用本机环境( 参考&#xff1a;使用Python…

如何将overleaf的latex格式转换为word

安装pandoc https://pandoc.org/installing.html 下载安装后&#xff0c;打开windows shell&#xff0c;测试是否安装成功&#xff1a; pandoc -v使用代码转换 进入你防止latex的文件夹&#xff0c;运行以下命令&#xff1a; pandoc -o output.docx -t docx .\main.tex其中…

录制微课的软件有哪些?这些软件你不能错过!

随着在线教育的蓬勃发展&#xff0c;微课已成为一种广受欢迎的教学形式。微课录制软件的选择对于教师而言至关重要&#xff0c;它不仅要具备简单易用的特点&#xff0c;还要能够满足高质量录制的需求。而对于教师来说&#xff0c;录制微课的软件有哪些呢&#xff1f;本文将介绍…

常用金属材料检测试题

一、单选题 1.正火采用的哪一种冷却方式( ) A.风冷 B.炉冷 C.油冷 D.空冷 参考答案:D 2.哪个合金属于弹簧钢?( ) A.20Cr B.9SiCr C.65Mn D.W18Cr4V 参考答案:C 3.T8A是什么工具钢?( ) A.碳素工具钢 B

【日常记录】【插件】js 获取浏览器信息、操作系统等相关信息

文章目录 1. 原生方式2. 插件的方式2.1 Bowser 的基本使用2.2 UAParser2.3 Platform.js 参考链接 1. 原生方式 原生方式可以通过 navigator.userAgent 来获取 需要写一个正则来匹配&#xff0c;获取相关的信息 2. 插件的方式 获取浏览器版本相关信息的库主要有以下几个 Bowser&…

无人机在应急救援中的几种应急方案

1.消防应急方案 MS190无人机消防应急载荷&#xff1a;配备有水基灭火弹、水枪、灭火弹抛投器等设备。也可携带不同的任务载荷&#xff0c;根据救援需求灵活配置&#xff0c;能够在火灾现场进行侦察、监测和灭火作业。 2.系留照明应急方案 M30系列无人机系留装置&#xff1a;…

高德API接入安卓相关问题说明

高德API接入安卓相关问题说明 我们都在怀念过去&#xff0c;失去后我们才懂得珍惜&#xff0c;有些人或事早已经远去&#xff0c;可是还是会想起曾经拥有的岁月&#xff0c;会是一种喜悦&#xff0c;会是一种遗憾…… 目前Android开发已经普遍使用Android Studio&#xff0c;开…

人工智能算法工程师(中级)课程1-Opencv视觉处理之基本操作

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能算法工程师(中级)课程1-Opencv视觉处理之基本操作。OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库。它提供了各种视觉处理函数&#xff0c;并…

红酒与电影经典:那些银幕上的醉人瞬间

在光影交织的银幕世界里&#xff0c;红酒不仅是品味生活的象征&#xff0c;更是情感与故事的催化剂。每当夜幕降临&#xff0c;一杯色泽深邃的红酒&#xff0c;便能带我们走进那些令人陶醉的影片瞬间&#xff0c;感受不同的人生百态。今天&#xff0c;就让我们一起回味那些银幕…

告别付费 API!使用 Ollama 和 MATLAB 玩转本地大模型

在“当MATLAB遇见ChatGPT&#xff1f;”一文中介绍了名为MatGPT的插件&#xff0c;该插件通过调用ChatGPT的API&#xff0c;实现了在MATLAB中与Chat GPT对话的功能。 虽然Open AI的GPT3.5和GPT4o可以免费使用&#xff0c;但调用API却需要收费&#xff0c;因此使用MatGPT这类插件…

mybatis 延迟加载

MyBatis的延迟加载&#xff08;Lazy Loading&#xff09;是一种优化技术&#xff0c;用于在需要时才加载关联对象或集合&#xff0c;从而提高性能和效率。以下是对MyBatis延迟加载的详细介绍&#xff1a; 延迟加载的基本概念 延迟加载是指在第一次访问对象的属性时才加载该对象…

阿一课代表随堂分享:红队反向代理之使用frp搭建反向代理

frp反向代理 frp简介 frp 是一个开源、简洁易用、高性能的内网穿透和反向代理软件&#xff0c;支持 tcp, udp, http, https等协议。 frp 是一个可用于内网穿透的高性能的反向代理应用&#xff0c;分为服务端frps和客户端frpc&#xff0c;支持 tcp, udp, http, https 协议。详…

修改服务器挂载目录

由于我们的项目通常需要挂载一个大容量的数据盘来存储文件数据&#xff0c;所以我们每台服务器都需要一个默认的挂载目录来存放这些数据&#xff0c;但是由于我们的误操作&#xff0c;导致挂载目录名字建错了&#xff0c;这时候后端就读不到挂载目录了&#xff0c;那我们我们的…

竟能让函数只执行一次?分享 1 段优质 JS 代码片段!

本内容首发于工粽号&#xff1a;程序员大澈&#xff0c;每日分享一段优质代码片段&#xff0c;欢迎关注和投稿&#xff01; 大家好&#xff0c;我是大澈&#xff01; 本文约 700 字&#xff0c;整篇阅读约需 1 分钟。 今天分享一段优质 JS 代码片段&#xff0c;确保某函数在某…