聊聊 C# dynamic 类型,并分享一个将 dynamic 类型变量转为其它类型的技巧和实例

news2025/1/14 1:25:08

image

前言

dynamic 是一种有别于传统变量类型的动态类型声明,刚开始接触可能在理解上会有些困难,可以简单地把它理解为一个盲盒,你可以任意猜测盒子有什么东西,并认为这些东西真正存在而进行处理,等到真正打开时,才能真正确定这些东西是不是真的存在。

所以,当使用 dynamic 声明一个变量时,编译器不会去检查该变量的成员或方法的有效性,换句话说,你可以调用任意成员或方法,即使它们不存在,编译器也不会报错,等到程序运行的时候,才会去解析,如果不存在,才会抛出错误。

dynamic 类型的这种特性,使得它在编程时非常灵活,很适合某些场景,比如与动态语言或COM互操作时,还有反射、JSON序列化/反序列化 等等。

下面分享一个将 dynamic 变量转为其它类型的技巧和实例。

Step By Step 步骤

  1. Linq 直接返回 List 变量

    private List<dynamic> BaseDataOfYZ(
    	QueryParam param,
    	string[] uos,
    	string[] ugs,
    	string uoEM,
    	string ugEM,
    	string wType)
    {
    	var query = BaseDataQuery(param, uos)
    		.Select(x => new { x.wType, x.UO, x.UG })
    		.GroupBy(x => x.wType)
    		.Select(x => new
    		{
    			wType = wType,
    			UONum1 = x.Count(t => t.UO == uoEM),
    			UONum2 = x.Count(t => t.UO == ugEM),
    			WtNum = x.Count(t => ugs.Contains(t.UG))
    		}).ToList<dynamic>();
    
    	return query;
    }
    

    说明:

    这样的好处就是不需要去定义一个实体类,尤其是这个实体类只用在这一处的时候,这样就会很灵活和减少无用的代码。

  2. 在实际业务场景中再将 List 变量转为其它类型(留意注释

    // 技巧:先 ToList - 再 Select new class - 最后再 ToList
    private List<WCoverDto> SummaryData(List<dynamic> list)
    {
    	var query2 = list
    		.Select(x => new { x.wType, x.UONum1, x.UONum2, x.WtNum })
    		.GroupBy(x => x.wType)
    		.Select(x => new
    		{
    			wType = x.Key,
    			UONum1 = x.Sum(t => t.UONum1),
    			UONum2 = x.Sum(t => t.UONum2),
    			WtNum = x.Sum(t => t.WtNum),
    		})
    		.ToList()
    		.Select(x => new WCoverDto
    		{
    			wType = x.wType,
    			UONum1 = x.UONum1,
    			UONum2 = x.UONum2,
    			Total = x.UONum1 + x.UONum2,
    			WtNum = x.WtNum
    		})
    		.ToList();
    
    	return query2;
    }
    

    说明:
    这是一个实际业务场景方法,对上一个方法产生的数据根据业务要求作进一步的处理,转成实际需要的对象类型

总结

dynamic 变量类型可以简化代码,处理动态数据时,可以方便地操作数据结构,但同时在使用中也要注意其缺陷,比如:

  1. 由于编译时无法进行类型检查,因此在运行时可能会出现类型转换错误或运行时异常。
  2. dynamic 类型在性能上可能会略逊于静态类型,因为它需要进行运行时绑定和解析。
  3. 过度使用 dynamic 可能会降低代码的可读性和维护性,因为编译器无法提供编译时的类型检查和智能感知。

总的来说,dynamic 类型在某些特定场景下能够提供方便和灵活性,但在使用时应慎重考虑其影响,避免在不必要的情况下使用 dynamic,只在确实需要动态类型绑定的情况下使用,最好地发挥 dynamic 类型的作用。

我是老杨,一个奋斗在一线的资深研发老鸟,让我们一起聊聊技术,聊聊人生。

都看到这了,求个点赞、关注、在看三连呗,感谢支持。

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

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

相关文章

【尚庭公寓SpringBoot + Vue 项目实战】预约看房与租约管理(完结)

【尚庭公寓SpringBoot Vue 项目实战】预约看房与租约管理&#xff08;完结&#xff09; 文章目录 【尚庭公寓SpringBoot Vue 项目实战】预约看房与租约管理&#xff08;完结&#xff09;1、业务说明2、接口开发2.1、预约看房管理2.1.1.保存或更新看房预约2.1.2. 查询个人预约…

mysql的安装以及分享navicat for MySQL

前言 根据网上分享的安装方法以及自己遇到的问题解决方法 一、mysql是什么&#xff1f; mysql 是一个开放源码的小型关联式数据库管理系统 二、安装过程 1.下载安装包 下载地址&#xff1a;MySQL :: Download MySQL Community Server 跳过直接下载&#xff0c;解压即可 …

10.华为路由器使用ospf动态路由连通两个部门网络

目的&#xff1a;实验ospf动态路由协议连通A与B部门 AR1配置 [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 1.1.1.1 24 [Huawei]vlan batch 10 [Huawei]int Vlanif 10 [Huawei]int e0/0/0 [Huawei-Ethernet0/0/0]port link-type access [Huawei-Ethernet0/0/0]por…

Spring Bean 生命周期详解

Spring Bean 生命周期详解 在 Spring 框架中&#xff0c;Bean 的生命周期由 Spring 容器全权管理。了解和掌握 Bean 的生命周期对于使用 Spring 开发稳定且高效的应用程序至关重要。本文将详细介绍 Spring Bean 生命周期的五个主要阶段&#xff1a;实例化、属性注入、初始化、…

Avue-data数据大屏显示饼图(附Demo)

目录 前言1. Sql查询2. 颜色细节 前言 对于这部分知识&#xff0c;原先有过柱状图实战&#xff1a;Avue-data数据大屏显示柱状图&#xff08;附Demo讲解&#xff09; 以下直奔主题&#xff0c;以Sql数据库数据为主 1. Sql查询 以饼图为例&#xff0c;需要返回的形式如下&am…

在敏捷项目管理中实施 Scrum 方法

在本文中&#xff0c;我将阐明敏捷项目管理中的 Scrum 流程。我将深入探讨 Scrum 方法论中不可或缺的角色。本文将全面概述敏捷开发中的 Scrum 流程。我将解释 Scrum 的核心组件&#xff0c;详细探索端到端 Scrum 流程。在本文结束时&#xff0c;您将清楚地了解 Scrum 的工作原…

Ant Design Vue Cascader 级联选择 错位问题

当Cascader 多个的时候 对应的下列会错位 如果滚动 他不会跟着元素 而是会跟着屏幕滚动&#xff0c;如下效果 解决方法 在Cascader 标题添加 getPopupContainer 属性监听对应的位置&#xff0c;返回对应的元素 <a-cascader class"smart-width-100 " v-model:…

QThread 与QObject::moveToThread在UI中的应用

1. QThread的两种用法 第一种用法就是继承QThread&#xff0c;然后覆写 virtual void run()&#xff0c; 这种用法的缺点是不能利用信号槽机制。 第二种用法就是创建一个线程&#xff0c;创建一个对象&#xff0c;再将对象moveToThread, 这种可以充分利用信号槽机制&#xff…

Android-Android Studio-FAQ

1 需求 2 接口 3 Android Studio xml布局代码补全功能失效问题 最终解决方案就是尝试修改compileSdk 为不同SDK版本来解决问题&#xff0c;将原本34修改为32测试会发现xml代码补全功能有效了&#xff01; 参考资料 Android Studio xml布局代码补全功能失效问题_android studi…

华为DCN技术:M-LAG

M-LAG&#xff08;Multichassis Link Aggregation Group&#xff09;即跨设备链路聚合组&#xff0c;是一种实现跨设备链路聚合的机制。M-LAG主要应用于普通以太网络、VXLAN和IP网络的双归接入&#xff0c;可以起到负载分担或备份保护的作用。相较于另一种常见的可靠性接入技术…

vue实现的商品列表网页

一、商品列表效果如下 二、代码&#xff1b; vue实现的商品列表网页 &#xff0c; 图片在vue项目的Public文件夹里的 imgs中 <template><div class"common-layout"><!-- el-container:外层容器。 当子元素中包含 <el-header> 或 <el-foo…

每天写java到期末考试(6.22)--集合5--练习

集合方法 正常输入对象到集合里面&#xff0c;运用public使用类方法 import java.util.ArrayList;public class test {public static void main(String[] args) {ArrayList<Student> listnew ArrayList<>();//2.创建学生对象Student s1new Student("yanxiao1&…

Allegro X PCB设计小诀窍系列--如何在Allegro X中将动态铜皮冻结

背景介绍&#xff1a;我们在进行PCB设计时&#xff0c;经常会用到动态铜皮&#xff0c;因为动态铜皮可以根据约束规则设置进行自动调整。但是在一些设计场景中&#xff0c;设计人员不希望对印制板的调整影响到动态铜皮&#xff0c;如果将动态铜皮转换为静态铜皮&#xff0c;又可…

Apple - Core Foundation Design Concepts

本文翻译整理自&#xff1a;Core Foundation Design Concepts&#xff08;更新日期&#xff1a;2013-12-16 https://developer.apple.com/library/archive/documentation/CoreFoundation/Conceptual/CFDesignConcepts/CFDesignConcepts.html#//apple_ref/doc/uid/10000122i 文章…

reidis的内存回收和内存淘汰策略

redis的内存回收 8种内存淘汰策略

地缘风险对出口的影响分析

核心观点 5月以来&#xff0c;CCFI运价涨幅显著扩大。除外需回暖外&#xff0c;集运“涨价”还有哪些催化因素&#xff0c;或如何影响后续出口&#xff1f; 一问&#xff1a;装箱航线运价大幅上涨背后&#xff1f;5月以来运价明显上涨&#xff0c;与外需复苏、出口改善相互印证…

基于uni-app和图鸟UI的云课堂小程序开发实践

摘要&#xff1a; 随着移动互联网的快速发展&#xff0c;移动学习已成为教育领域的重要趋势。本文介绍了基于uni-app和图鸟UI框架开发的云课堂小程序&#xff0c;该小程序实现了移动教学、移动学习、移动阅读和移动社交的完美结合&#xff0c;为用户提供了一个便捷、高效的学习…

数仓中数据分层的标准流向解读

在大数据开发中&#xff0c;数据分层是一个至关重要的概念。合理的数据分层可以有效地提升数据处理的效率和质量。本文将详细介绍数据分层的标准流向和相关注意事项&#xff0c;并结合实际应用进行说明。 数据分层的标准流向 根据行业标准&#xff0c;数据分层的标准流向如下…

七、yolov8图像标注和模型训练(目标检测)

环境配置方法&#xff1a;点这里 环境配置完毕后&#xff0c;需要进行标注工作和训练任务&#xff0c;以下分两个部分进行。 图片标注 1、按照以下的格式&#xff0c;将图片放入images中。&#xff08;不限制文件夹路径&#xff09; 2、然后下载labelme标注工具&#xff0…

【分布式系列】分布式锁timeout了怎么办?

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…