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

news2024/12/29 0:31:09

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.coloradmin.cn/o/1660611.html

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

相关文章

FFmpeg常用API与示例(二)—— 解封装与转封装

封装层 封装格式(container format)可以看作是编码流(音频流、视频流等)数据的一层外壳&#xff0c;将编码后的数据存储于此封装格式的文件之内。 封装又称容器&#xff0c;容器的称法更为形象&#xff0c;所谓容器&#xff0c;就是存放内容的器具&#xff0c;饮料是内容&…

机器人种类分析

2000年前&#xff0c;机器人主要应用于工业生产&#xff0c;俗称工业机器人&#xff0c;由示教器操控&#xff0c;帮助工厂释放劳动力&#xff0c;此时的机器人并没有太多智能而言&#xff0c;完全按照人类的命令执行动作&#xff0c;更加关注电气层面的驱动器、伺服电机、减速…

深度剖析:为何跨境卖家纷纷转向自养号测评?

自养号测评&#xff0c;作为跨境电商卖家的一种关键运营策略&#xff0c;具有举足轻重的地位。通过精心策划的自养号测评&#xff0c;卖家能够有效地推动产品销量的飙升、评论数量的积累&#xff0c;并在平台内实现排名的显著上升。这一系列的正面效果进而有助于提升产品的曝光…

每日一题——力扣27. 移除元素(举一反三)

题目链接&#xff1a;https://leetcode.cn/problems/remove-element/description/ 菜鸡写法&#xff1a; // 函数定义&#xff0c;移除数组nums中所有值为val的元素&#xff0c;并返回新的数组长度 int removeElement(int* nums, int numsSize, int val) {// 如果数组长度为…

kernel32.dll丢失要如何解决?电脑kernel32.dll文件下载方法

kernel32.dll丢失要怎么解决才好&#xff1f;其实针对这个问题还是有很多种的解决方法的&#xff0c;只要你明白了kernel32.dll的作用&#xff0c;了解kernel32.dll&#xff0c;那么就可以有很多种方法去解决&#xff0c;下面一起来看看吧。 一.了解kernel32.dll文件 kernel32…

更新、简略高效的用git(Gitee篇)

前提&#xff1a;因为很多编译软件虽然可以连接git&#xff0c;但是操作起来还是比较懵&#xff0c;不同软件有不同的上传git的方式&#xff0c;而且有的连着GitHub有的是Gitee&#xff0c;那么使用Git Bash无疑是万无一失的方式 然后这一篇也仅针对上传Gitee&#xff0c;上传G…

数据结构05:树与二叉树 习题01[C++]

考研笔记整理&#xff0c;本篇作为树与二叉树的基本概念习题&#xff0c;供小伙伴们参考~&#x1f95d;&#x1f95d; 之前的博文链接在此&#xff1a;数据结构05&#xff1a;树与二叉树[C]-CSDN博客~&#x1f95d;&#x1f95d; 第1版&#xff1a;王道书的课后习题~&#x1…

YOLO-World环境搭建推理测试

一、引子 CV做了这么多年&#xff0c;大多是在固定的数据集上训练&#xff0c;微调&#xff0c;测试。突然想起来一句话&#xff0c;I have a dream&#xff01;就是能不能不用再固定训练集上捣腾&#xff0c;也就是所谓的开放词汇目标检测&#xff08;OVD&#xff09;。偶尔翻…

【总结】CE认证详解

文章目录 CE认证 CE作用 适用范围 测试项目 一、2014/30/EU指令&#xff0c;电磁兼容&#xff08;EMC&#xff09;测试项目 二、2014/35/EU指令&#xff0c;低电压&#xff08;LVD&#xff09;测试项目 三、2011/65/EU指令&#xff0c;有害物质&#xff08;RoHS&#xff09…

Linux进程间通信方式

每个进程的用户空间都是独立的&#xff0c;不能相互访问。 所有进程的内核空间(32位系统3G-4G)都是共享的 应用场景 作为缓冲区&#xff0c;处理速度不同的进程之间的数据传输资源共享&#xff1a;多个进程之间共享同样的资源&#xff0c;一个进程对共享数据的修改&#xff0c…

MathType2024官方版数学公式编辑器功能全面介绍

在数字化学习和科研的浪潮中&#xff0c;数学公式的编辑与展示成为了不可或缺的一部分。MathType&#xff0c;作为一款专业的数学公式编辑器&#xff0c;凭借其强大的功能和便捷的操作&#xff0c;为科研人员、教师、学生等广大用户提供了极大的便利。下面&#xff0c;我们将对…

docker compose kafka集群部署

kafka集群部署 目录 部署zookeeper准备工作2、部署kafka准备工作3、编辑docker-compose.yml文件4、启动服务5、测试kafka6、web监控管理 部署zookeeper准备工作 mkdir data/zookeeper-{1,2,3}/{data,datalog,logs,conf} -p cat >data/zookeeper-1/conf/zoo.cfg<<EOF…

在CentOS 7服务器及Windows 10客户端间建立并配置NFS服务

在CentOS 7服务器及Windows 10客户端间建立并配置NFS服务 引言 网络文件系统(Network File System)&#xff0c;简称NFS&#xff0c;是一种分布式文件系统协议。它允许网络上的客户端机器像访问本地磁盘文件一样&#xff0c;通过网络访问服务器上的文件。在某些特定的业务场景中…

【Linux】模拟实现bash(简易版)

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 如果文章对…

未来相遇过去:博物馆藏品管理平台的科技革新之旅

引言&#xff1a; 尊重历史&#xff0c;意味着保护其实体的载体。在博物馆这个时间的容器中&#xff0c;每一件藏品都承载着人类文明的印记&#xff0c;它们是历史的低语&#xff0c;是过去对现在的细语。在这篇文章中&#xff0c;我将带您走进博物馆的幕后&#xff0c;探究藏品…

wireshark-cli工具Tshark工具使用教程

介绍 本文档基于wireshark-2.6.10/编写 tshark为wireshark工具的命令行版本呢&#xff0c; 在服务器版本服务器上&#xff0c;通过tshark工具可以实现和wireshark相同的功能。工具使用wireshark默认配置&#xff0c;对于wireshark一些常用的首选项&#xff0c;也可通过tshark…

文献速递:深度学习医学影像心脏疾病检测与诊断--基于迁移学习的生成对抗网络用于静态和动态心脏PET的衰减校正

Title 题目 Transfer learning‑based attenuation correction for static and dynamic cardiac PET using a generative adversarial network 基于迁移学习的生成对抗网络用于静态和动态心脏PET的衰减校正 01 文献速递介绍 心脏正电子发射断层扫描&#xff08;PET&#xf…

【ArcGIS Pro微课1000例】0059:计算地级城市之间的距离

一、加载数据并符号化 1. 加载实验数据 数据加载完毕。 2. 符号化设置 点击面状数据符号,在右侧的符号系统中选择黑色轮廓。 点击点状符号,选择以个样式。 3. 标注名称 选择地级市图层,打开标注选项卡,设置标注字段为name,设置字体属性,如下所示:

Screeps工程化之数量控制模块

前言 将Screeps的代码进行模块化后&#xff0c;可以将各个功能进行分离&#xff0c;互相不影响&#xff0c;本文将会介绍Screeps中如何进行creep的数量控制来维持房间资源的平衡和发展。本文仅为作者本人的游戏思路&#xff0c;并不是最佳实践&#xff0c;如有更好的实现方法可…

*args和**kwargs的使用

*args传入的是按照顺序的不定长度的参数列表 **kwargs传入的是不定长度的键值对