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

2024-06-22 12:12

本文主要是介绍聊聊 C# dynamic 类型,并分享一个将 dynamic 类型变量转为其它类型的技巧和实例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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 类型的作用。

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

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

这篇关于聊聊 C# dynamic 类型,并分享一个将 dynamic 类型变量转为其它类型的技巧和实例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1084256

相关文章

一文解析C#中的StringSplitOptions枚举

《一文解析C#中的StringSplitOptions枚举》StringSplitOptions是C#中的一个枚举类型,用于控制string.Split()方法分割字符串时的行为,核心作用是处理分割后... 目录C#的StringSplitOptions枚举1.StringSplitOptions枚举的常用

Python之变量命名规则详解

《Python之变量命名规则详解》Python变量命名需遵守语法规范(字母开头、不使用关键字),遵循三要(自解释、明确功能)和三不要(避免缩写、语法错误、滥用下划线)原则,确保代码易读易维护... 目录1. 硬性规则2. “三要” 原则2.1. 要体现变量的 “实际作用”,拒绝 “无意义命名”2.2. 要让

C#自动化实现检测并删除PDF文件中的空白页面

《C#自动化实现检测并删除PDF文件中的空白页面》PDF文档在日常工作和生活中扮演着重要的角色,本文将深入探讨如何使用C#编程语言,结合强大的PDF处理库,自动化地检测并删除PDF文件中的空白页面,感... 目录理解PDF空白页的定义与挑战引入Spire.PDF for .NET库核心实现:检测并删除空白页

C#利用Free Spire.XLS for .NET复制Excel工作表

《C#利用FreeSpire.XLSfor.NET复制Excel工作表》在日常的.NET开发中,我们经常需要操作Excel文件,本文将详细介绍C#如何使用FreeSpire.XLSfor.NET... 目录1. 环境准备2. 核心功能3. android示例代码3.1 在同一工作簿内复制工作表3.2 在不同

利用Python把路径转为绝对路径的方法

《利用Python把路径转为绝对路径的方法》在Python中,如果你有一个相对路径并且想将其转换为绝对路径,你可以使用Path对象的resolve()方法,Path是Python标准库pathlib中... 目录1. os.path.abspath 是什么?怎么用?基本用法2. os.path.abspat

C#中通过Response.Headers设置自定义参数的代码示例

《C#中通过Response.Headers设置自定义参数的代码示例》:本文主要介绍C#中通过Response.Headers设置自定义响应头的方法,涵盖基础添加、安全校验、生产实践及调试技巧,强... 目录一、基础设置方法1. 直接添加自定义头2. 批量设置模式二、高级配置技巧1. 安全校验机制2. 类型

PyQt6 键盘事件处理的实现及实例代码

《PyQt6键盘事件处理的实现及实例代码》本文主要介绍了PyQt6键盘事件处理的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起... 目录一、键盘事件处理详解1、核心事件处理器2、事件对象 QKeyEvent3、修饰键处理(1)、修饰键类

C#使用iText获取PDF的trailer数据的代码示例

《C#使用iText获取PDF的trailer数据的代码示例》开发程序debug的时候,看到了PDF有个trailer数据,挺有意思,于是考虑用代码把它读出来,那么就用到我们常用的iText框架了,所... 目录引言iText 核心概念C# 代码示例步骤 1: 确保已安装 iText步骤 2: C# 代码程

90%的人第一步就错了! 顺利登录wifi路由器后台的技巧

《90%的人第一步就错了!顺利登录wifi路由器后台的技巧》登录Wi-Fi路由器,其实就是进入它的后台管理页面,很多朋友不知道该怎么进入路由器后台设置,感兴趣的朋友可以花3分钟了解一下... 你是不是也遇到过这种情况:家里网速突然变慢、想改WiFi密码却不知道从哪进路由器、新装宽带后完全不知道怎么设置?别慌

C#实现高性能拍照与水印添加功能完整方案

《C#实现高性能拍照与水印添加功能完整方案》在工业检测、质量追溯等应用场景中,经常需要对产品进行拍照并添加相关信息水印,本文将详细介绍如何使用C#实现一个高性能的拍照和水印添加功能,包含完整的代码实现... 目录1. 概述2. 功能架构设计3. 核心代码实现python3.1 主拍照方法3.2 安全HBIT