C#中字典Dictionary与自定义类型CustomType之间的转换

C#中字典Dictionary与自定义类型CustomType之间的转换

思路:

可以使用反射System.Reflection来获取类的具体属性,

属性名称就映射字典的键Key。

新建控制台程序DictionaryCustomClassConversionDemo

第一步、新建关键转换类ConversionUtil。

类ConversionUtil的源代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;namespace DictionaryCustomClassConversionDemo
{/// <summary>/// 字典Dictionary与自定义类CustomClass属性之间的转化/// 斯内科 2024-05-10/// </summary>public class ConversionUtil{/// <summary>/// 将一个实体类的属性转化为键值对集合,键为属性名PropertyName,值为对应的值/// </summary>/// <typeparam name="T">一种自定义类,该类必须已实例化</typeparam>/// <param name="obj">实例化后的类对象</param>/// <returns>返回转化后的字典</returns>public static Dictionary<string, object> CustomClassToDictionary<T>(T obj) where T : class, new(){Dictionary<string, object> dict = new Dictionary<string, object>();Type type = typeof(T);PropertyInfo[] propertyInfos = type.GetProperties();for (int i = 0; i < propertyInfos.Length; i++){string key = propertyInfos[i].Name;object val = propertyInfos[i].GetValue(obj);dict.Add(key, val);}return dict;}/// <summary>/// 将字典转化为实例化类,如果类的属性名称在字典中存在该键key,就使用该键对应的值为类的属性key赋值【注意,转化可能因值的类型、范围等不同而导致失败】/// 如果类的属性名称在字典中不存在该键key,则不进行赋值,只是按属性对应类型的默认值处理/// </summary>/// <typeparam name="T">要转化的目标类型</typeparam>/// <param name="dict">键值对字典</param>/// <returns>要获取的目标实例化类对象,如果字典为空,则按类的默认值处理</returns>public static T DictionaryToCustomClass<T>(Dictionary<string, object> dict) where T : class{T obj = default(T);if (dict == null || dict.Count == 0) {return obj;}Type type = typeof(T);obj = (T)Activator.CreateInstance(type);PropertyInfo[] propertyInfos = type.GetProperties();for (int i = 0; i < propertyInfos.Length; i++){string key = propertyInfos[i].Name;if (dict.ContainsKey(key)) {propertyInfos[i].SetValue(obj, dict[key]);}}return obj;}}
}

二、新建实体测试类TestClass。

测试类TestClass源程序如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace DictionaryCustomClassConversionDemo
{/// <summary>/// 测试类/// </summary>public class TestClass{/// <summary>/// 主键/// </summary>public int CoreID { get; set; }/// <summary>/// 档位编号/// </summary>public int LevelId { get; set; }/// <summary>/// 电压下限/// </summary>public double VoltageMin { get; set; }/// <summary>/// 电压上限/// </summary>public double VoltageMax { get; set; }/// <summary>/// 内阻值/// </summary>public string Resistance { get; set; }/// <summary>/// 修改时间/// </summary>public DateTime ModifyTime { get; set; }public override string ToString(){return $"{{CoreID:{CoreID},\nLevelId:{LevelId},\nVoltageMin:{VoltageMin},\nVoltageMax:{VoltageMax},\nResistance:{Resistance},\nModifyTime:{ModifyTime.ToString("yyyy-MM-dd HH:mm:ss")}}}";}}
}

三、调用测试Program如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace DictionaryCustomClassConversionDemo
{class Program{static void Main(string[] args){Console.SetWindowSize(100, 60);try{TestClass testClass = new TestClass(){CoreID = 6,LevelId = 3,VoltageMin = 3.10,VoltageMax = 3.99,Resistance = "888MΩ",ModifyTime = DateTime.Now};Console.WriteLine($"--------打印原对象信息:--------");Console.WriteLine(testClass);Dictionary<string, object> dict = ConversionUtil.CustomClassToDictionary(testClass);Console.WriteLine("--------打印类对象转化后的字典信息:--------");for (int i = 0; i < dict.Count; i++){KeyValuePair<string, object> keyValuePair = dict.ElementAt(i);Console.WriteLine($"{keyValuePair.Key}:{keyValuePair.Value}");}Console.WriteLine();Console.WriteLine("--------测试字典转化为类--------");dict["Resistance"] = "333MΩ";dict["LevelId"] = 1;dict["VoltageMax"] = 5;dict.Add("额外参数", "额外值");Console.WriteLine("--------打印原字典信息1:--------");for (int i = 0; i < dict.Count; i++){KeyValuePair<string, object> keyValuePair = dict.ElementAt(i);Console.WriteLine($"{keyValuePair.Key}:{keyValuePair.Value}");}TestClass testObj1 = ConversionUtil.DictionaryToCustomClass<TestClass>(dict);Console.WriteLine("--------打印字典转化为类对象1--------");Console.WriteLine(testObj1);Console.WriteLine();dict["Resistance"] = 66666;dict["LevelId"] = 5;Console.WriteLine("--------打印原字典信息2:--------");for (int i = 0; i < dict.Count; i++){KeyValuePair<string, object> keyValuePair = dict.ElementAt(i);Console.WriteLine($"{keyValuePair.Key}:{keyValuePair.Value}");}TestClass testObj2 = ConversionUtil.DictionaryToCustomClass<TestClass>(dict);Console.WriteLine("--------打印字典转化为类对象2--------");Console.WriteLine(testObj2);}catch (Exception ex) {Console.WriteLine($"{ex.Message}.异常类型【{ex.GetType()}】");}Console.ReadLine();}}
}

4、程序运行如图:

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

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

相关文章

智能创作时代:AI 如何重塑内容生成游戏规则

文章目录 前言一&#xff1a;自动化内容生成文章生成视频制作音频创作 二&#xff1a;内容分发与推广智能推荐系统社交媒体优化 三&#xff1a;内容分析与优化数据分析用户反馈质量控制 结语 前言 在数字化时代的浪潮中&#xff0c;内容生产与消费已成为信息传播的核心。随着人…

数据结构与算法学习笔记九-二叉树的链式存储表示法和实现(C语言)

目录 前言 1.二叉树的链式存储 2.二叉链表的表示和实现 1.定义 2.创建 4.中序遍历二叉树 5.后序遍历二叉树 6.后序遍历二叉树 7.完整代码 前言 这篇博客主要介绍二叉树的链式存储结构。 1.二叉树的链式存储 上篇文章中介绍了二叉树的顺序存储结构&#xff0c;在最坏的…

ESP32引脚入门指南(六):从理论到实践(UART)

ESP32开发板具有UART0、UART1和UART2三个UART接口&#xff0c;支持异步通信(RS232和RS485)和IrDA速率高达5mbps。这些接口提供了丰富的串行通信选项&#xff0c;允许与各种设备进行全双工通信。 UART接口概述与引脚配置 UART 是一种全双工通信协议&#xff0c;允许数据同时在…

UE4 3D文字自动换行

效果&#xff1a;3D文字超过5位自动换行 1.随意输入一段字符串测试&#xff0c;创建string临时变量&#xff0c;用于迭代存储字符串 2.当字符串遍历至第“换行长度”&#xff08;我这里是5&#xff09;位时&#xff0c;附加一次空行

企业信使运营管理平台功能介绍

企业信使运营管理平台是一种为企业提供内部协同、任务管理、沟通交流、文件共享等功能的综合性管理平台。该平台旨在提高企业内部的工作效率和沟通协作能力&#xff0c;提供便捷的工作管理工具&#xff0c;促进企业的业务发展。 内部协同功能 企业信使运营管理平台首先提供一种…

LM4562NA 直插DIP8双运放 音频hifi运算放大器

LM4562NA是一款高性能音频运算放大器&#xff0c;其应用领域主要集中在音频和声音处理方面&#xff0c;包括但不限于&#xff1a; 1. 专业录音设备&#xff1a;在录音棚、广播电台和电视台等专业环境中&#xff0c;用于信号放大和处理&#xff0c;确保高质量的声音录制和传输…

Flask 通过SQLAlchemy连接mySQL实现一个实用的用户管理功能

Flask 通过SQLAlchemy连接mySQL实现一个实用的用户管理功能 安装配置 首先确保已经安装如下程序&#xff1a; flask&#xff1a;用于构建web应用程序。flask-sqlalchemy&#xff1a;用于在 Flask 中连接 MySQL 数据库&#xff0c;通过pip install flask-sqlalchemy安装。pym…

无需公网IP、无需云服务器,异地组网实现远程直连NAS、游戏联机

手机图片、视频太多&#xff0c;存储空间不够用怎么办?出门在外无法直连家中NAS&#xff0c;远程访问NAS速度慢&#xff1f;自建私有云、多媒体服务器&#xff0c;如何多人远程共享媒体资源&#xff1f;幻兽帕鲁、我的世界、泰拉瑞亚…局域网游戏&#xff0c;想远程多人联机&a…

The Sandbox 与 Cuisinia 合作推出全新体验!

与 Cuisinia 一起吃 Voxel&#xff01; 召唤所有美食家和游戏玩家&#xff01;准备好在 Cuisinia x The Sandbox Moodie 挑战赛中挑逗你的味蕾&#xff0c;考验你的技能&#xff01;加入我们的美味探险&#xff0c;品尝充满活力的泰国美食。 为什么选择 Cuisinia&#xff1f; …

百融云创回购计划加速落实 机构看好中长期吸引力

单日回购近400万港元B类股份&#xff0c;一站式服务的AI科技领航者百融云创&#xff08;百融云-W,6608.HK&#xff09;的回购计划正在加速落实。 此前&#xff0c;在百融云创2023年年度业绩公告的同时&#xff0c;该公司一并披露将在2024年不时在公开市场购回总金额不超过2.5亿…

知识蒸馏,需要合适的教师模型,学生模型,蒸馏数据,损失函数,训练策略,让小模型有大模型的知识

知识蒸馏使用的是Teacher—Student模型&#xff0c;其中teacher是“知识”的输出者&#xff0c;student是“知识”的接受者。知识蒸馏的过程分为2个阶段: 原始模型训练: 训练"Teacher模型", 它的特点是模型相对复杂&#xff0c;也可以由多个分别训练的模型集成而成。…

3D Gaussian Splatting for Real-Time Radiance Field Rendering 论文阅读

如此热门的项目&#xff0c;网络上有很多大牛分析了这篇文章的做法&#xff0c;在这里简单记录一下个人粗浅的理解。 关于各种数学表达式的推导&#xff0c;论文和参考资料中都提供了较为详细的解读&#xff0c;本人能力有限&#xff0c;这一部分理解不够深刻&#xff0c;先不做…