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.mfbz.cn/a/610671.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GB2312发码测试

编码表&#xff1a;https://www.toolhelper.cn/Encoding/GB2312 GB2312 编码表 GB 2312 标准由中国国家标准总局 1980 年发布&#xff0c;GB 即国标&#xff0c;共收录 6763 个汉字&#xff0c;其中一级汉字 3755 个&#xff0c;二级汉字 3008 个。 GB 2312 的出现&#xff0…

领导关怀 | 西湖区委常委韩斌等一行领导调研创邻科技

5月8日&#xff0c;西湖区委常委韩斌、紫金港科技城管委会党委委员、副主任陈杰、西湖区委办副主任韩鹰等一行领导走访创邻科技&#xff0c;关心企业发展近况。创邻科技COO吴菁、CTO周研陪同参观交流。 韩斌常委一行首先参观了企业荣誉展示区和办公区。参观过程中&#xff0c;…

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

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

Git 如何管理标签命令(tag)

1.查看本地仓库tag --1.查看本地仓库tag UserDESKTOP-2NRT2ST MINGW64 /e/GITROOT/STARiBOSS/STARiBOSS-5GCA (gw_frontend_master) $ git tag 1stBossUpgrade V10.0.1_20220224_test V10.0.1_20220301_test tag-gwfrontend-V1.0.12-230625 tag-gw_frontend-23.08.29 tag-gw_f…

【python基础】python经典题目100题

文章目录 前言初阶题目1.字符串2.列表3.元组4.字典5.运算6.random 模块7.open函数8.time模块时间9.其他 进阶题目 前言 本文主要是python经典题目100题&#xff0c;适合入门的新手。仅作自己学习的记录。 初阶题目 1.字符串 题目1&#xff1a;怎么找出序列中的最⼤最⼩值&am…

360极速浏览器X全新Chromium内核极致顺滑,绿色便携版 v22.3.1002.64

01 软件介绍 360极速浏览器X是一款基于Chromium 95的高级双核浏览器&#xff0c;支持IE内核&#xff0c;并优化了用户体验与性能。包括无广告弹窗&#xff0c;新增的阅读模式&#xff0c;个性化标签页壁纸&#xff0c;以及专业导航功能&#xff0c;旨在提供更快、更高效的浏览…

Ubuntu意外断电vmdk损坏--打不开磁盘“***.vmdk”或它所依赖的某个快照磁盘。

背景&#xff1a;电脑资源管理器崩溃卡死&#xff0c;强行断电重启&#xff0c;结果虚拟机打不开了&#xff0c;提示打不开磁盘“***.vmdk”或它所依赖的某个快照磁盘。 删除lck文件&#xff1a;失败vmware-vdiskmanager修复 &#xff1a;提示无法修复最终用 VMFS Recovery挂载…

找不到vcruntime140_1.dll怎么办,介绍5种简单有效的解决方法

当您的电脑系统提示找不到vcruntime140_1.dll文件时&#xff0c;这通常意味着系统在尝试运行某个应用程序或游戏时&#xff0c;无法定位到这个至关重要的动态链接库&#xff08;DLL&#xff09;文件。此情况可能源于几个不同的原因&#xff0c;包括但不限于&#xff1a;文件被误…

中信证券:量子产业蓄势待发,看好相关投资机会!

在1994年&#xff0c;数学家彼得肖尔&#xff08;Peter Shor&#xff09;首次提出了现在广为人知的肖尔算法&#xff0c;那时许多人认为量子计算机的概念遥不可及、纯属幻想。然而&#xff0c;到了2024年&#xff0c;全球正深入探讨量子科技在现实世界的应用&#xff0c;以及所…

智启未来:富唯智能AI-ICDP引领的可重构柔性装配产线

在全球制造业竞争日益激烈的今天&#xff0c;如何快速响应市场变化、提高生产效率、降低生产成本&#xff0c;成为了企业面临的重要挑战。随着产品个性化时代的到来&#xff0c;装配产品频繁变换&#xff0c;多品种小批量的生产模式逐渐成为主流。在这一背景下&#xff0c;富唯…

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

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

Docker部署Azure chatgpt样例应用

Github地址 https://github.com/microsoft/sample-app-aoai-chatGPT?tabreadme-ov-file#environment-variables 使用Amazon Linux 2 AMI 的arm 64版本镜像, t4g.medium实例。 需要安装git&#xff0c;可能需要安装 pip3等 sudo apt-get install -y python3-pip 然后从如下…

Day7 字符串和常用数据结构

文章目录 字符串和常用数据结构使用字符串使用列表生成式和生成器使用元组使用集合使用字典练习练习1&#xff1a;在屏幕上显示跑马灯文字。练习2&#xff1a;设计一个函数产生指定长度的验证码&#xff0c;验证码由大小写字母和数字构成。练习3&#xff1a;设计一个函数返回给…

希捷硬盘打不开怎么把资料拿出来

在现代社会&#xff0c;硬盘作为存储数据的重要设备&#xff0c;一旦出现问题&#xff0c;往往会让我们倍感焦虑。尤其是当希捷硬盘打不开时&#xff0c;很多人可能会感到无从下手。本文将为大家介绍一些实用的方法&#xff0c;帮助您在希捷硬盘无法打开的情况下&#xff0c;依…

适合中小生产企业的ERP软件有哪些?推荐用哪个?

总结一下适合中小生产企业的ERP软件的需求 功能全面&#xff1a;能够进行客户管理、供应商管理、销售管理、采购管理、财务管理&#xff1b;适用规模&#xff1a;适合10人以内的中小生产企业&#xff1b; 相信很多企业也和题主一样&#xff0c;对ERP软件有如上要求&#xff0…

前端基础知识-ES6解构赋值(将数组内元素、字符串内字符、对象内属性值快速赋值给其他变量)

前言&#xff1a; 将数组、字符串、对象进行展开&#xff0c;并将展开的数据赋值给指定变量&#xff0c;以达到语法简化的目的&#xff0c;日常开发中可以大大提升我们的效率。 主要语法&#xff1a; 一、[变量1,变量2。。。]目标数组 将数组里面的内容赋给其他变量 场景1…

Canvas绘制图片和区域(前端使用Canvas绘制图片,并在图片上绘制区域)

简介&#xff1a;在Web开发中&#xff0c;有时候我们需要在图片上进行一些交互式操作&#xff0c;比如绘制区域、标记等。这种场景下&#xff0c;我们可以使用HTML5的<canvas>元素来实现。Canvas 是 HTML5 提供的一种图形绘制接口&#xff0c;可以通过 JavaScript 在网页…

GPU云渲染平台选择应该看什么?瑞云渲染带你了解

在选择GPU云渲染平台时&#xff0c;关键的考量因素包括渲染速度、支持的软件兼容性、价格性价比以及用户服务质量。了解这些指标将帮助用户在众多选项中做出明智的选择&#xff0c;以优化渲染效率和成本效益。 一、GPU与渲染有什么关系 GPU与渲染有着密切的关系&#xff0c;在…

如何创建window11虚拟机,超详细!!!

为什么要创建window11虚拟机&#xff0c;有了虚拟机&#xff0c;可以避免一些软件的危害&#xff0c;我们可以在虚拟机里&#xff0c;测试软件的安全性。当然你也可以在虚拟机里体验下流氓软件带来的快乐。众所周知&#xff0c;流氓软件会修改默认浏览器&#xff0c;将几款流氓…

影刀进行shopee商品排名零代码爬取

需要研究shopee平台的排名更新时间段和周期&#xff0c;几分钟用影刀写了一个爬取应用&#xff0c;每10分钟进行一次排名爬取&#xff08;以fan‘风扇’为例&#xff09;&#xff0c;0代码爬取。 打开’fan’关键词搜索网页&#xff1b;等待网页加载&#xff1b;滚动进一步加载…
最新文章