C# 动态类型 Dynamic
文章目录
- 前言
- 1. 什么是 Dynamic?
- 2. 声明 Dynamic 变量
- 3. Dynamic 的运行时类型检查
- 4. 动态类型与反射的对比
- 5. 使用 Dynamic 进行动态方法调用
- 6. Dynamic 与 原生类型的兼容性
- 7. 动态与 LINQ 的结合
- 8. 结合 DLR 特性
- 9. 动态类型的性能考虑
- 10. 何时使用 Dynamic?
- 总结
前言
在 C# 中,dynamic 关键字是一种重要的类型,允许开发者绕过编译时的类型检查,以便在运行时动态决定类型。这种特性提供了更大的灵活性,尤其在处理动态数据、COM 组件、动态语言接口(DLR)等场合非常有用。
1. 什么是 Dynamic?
dynamic 类型允许变量在运行时被赋予任何数据类型。与 object 类型不同,dynamic 类型的变量在编译时不进行类型检查,而是在运行时解析,从而提供了更大的灵活性。使用 dynamic,你可以调用对象的方法和属性,而不需要在编译时确定它们是否存在。
2. 声明 Dynamic 变量
可以使用 dynamic 关键字来声明变量,声明后的变量可以在运行时赋予不同的值和类型。由于编译器不会在编译时检查这些类型,因此在使用时要小心,以避免在运行时出现异常。
using System;class Program
{static void Main(){dynamic value = 10; // 声明 dynamic 变量Console.WriteLine(value); // 输出: 10value = "Hello, world!"; // 重新赋值为字符串Console.WriteLine(value); // 输出: Hello, world!}
}
3. Dynamic 的运行时类型检查
由于 dynamic 类型在编译时不进行类型检查,因此它的调用在运行时会进行解析。如果调用了一个不存在的方法或属性,程序会在运行时抛出异常。
using System;class Program
{static void Main(){dynamic obj = new System.Text.StringBuilder("Hello");// 正确调用方法obj.Append(", world!");Console.WriteLine(obj); // 输出: Hello, world!// 错误调用方法try{obj.NonExistentMethod(); // 此方法不存在,运行时会抛出异常}catch (Microsoft.CSharp.RuntimeBinder.RuntimeBinderException ex){Console.WriteLine("运行时错误: " + ex.Message); // 输出: 运行时错误: 'System.Text.StringBuilder' does not contain a definition for 'NonExistentMethod'}}
}
4. 动态类型与反射的对比
动态类型的灵活性使得它在一些场合下比反射更为便利。反射在很多情况下显得冗长和繁琐,而动态类型允许更简洁的代码编写。
using System;
using System.Dynamic;class Program
{static void Main(){dynamic expando = new ExpandoObject(); // 创建动态对象expando.Name = "Alice"; // 添加属性expando.Age = 30;// 动态调用属性Console.WriteLine($"{expando.Name} is {expando.Age} years old."); // 输出: Alice is 30 years old.}
}
5. 使用 Dynamic 进行动态方法调用
利用 dynamic 关键字,你可以在运行时调用某个对象的动态方法,而无需了解具体的实现细节。
using System;class Calculator
{public int Add(int a, int b) => a + b;public int Subtract(int a, int b) => a - b;
}class Program
{static void Main(){dynamic calc = new Calculator();Console.WriteLine(calc.Add(5, 3)); // 输出: 8Console.WriteLine(calc.Subtract(5, 3)); // 输出: 2}
}
6. Dynamic 与 原生类型的兼容性
dynamic 变量可以与原生类型进行互操作。当与具体类型交互时,动态类型会根据需要进行转换,但要确保操作的类型是兼容的。
using System;class Program
{static void Main(){dynamic value = 100;int intValue = value; // 将 dynamic 赋值给 intConsole.WriteLine($"Dynamic 值: {value}, Int 值: {intValue}"); // 输出: Dynamic 值: 100, Int 值: 100}
}
7. 动态与 LINQ 的结合
dynamic 可以在 LINQ 查询中使用,特别是在处理动态数据源时。例如,从 JSON 数据中读取并转换为动态对象。
using System;
using System.Collections.Generic;
using System.Dynamic;
using System.Linq;class Program
{static void Main(){var people = new List<ExpandoObject>(); // 创建动态对象列表dynamic person1 = new ExpandoObject();person1.Name = "Alice";person1.Age = 30;people.Add(person1);dynamic person2 = new ExpandoObject();person2.Name = "Bob";person2.Age = 25;people.Add(person2);var youngPeople = people.Where(p => p.Age < 30); // 使用 LINQ 查询动态对象foreach (var person in youngPeople){Console.WriteLine(person.Name); // 输出: Bob}}
}
8. 结合 DLR 特性
dynamic 类型基于动态语言运行时(DLR),可以使用其特性创建复杂的动态对象。这使得在处理 XML、JSON 等动态数据时更加方便。
using System;
using System.Dynamic;class Program
{static void Main(){dynamic person = new ExpandoObject();person.Name = "Charlie";person.Age = 40;// 动态添加属性person.City = "New York";Console.WriteLine($"Name: {person.Name}, Age: {person.Age}, City: {person.City}"); // 输出: Name: Charlie, Age: 40, City: New York}
}
9. 动态类型的性能考虑
尽管动态类型提供了很大的灵活性,但其性能通常低于静态类型。对于性能关键的应用,建议在性能与灵活性之间做出权衡。在不需要动态性的地方,使用静态类型会更加高效。
10. 何时使用 Dynamic?
使用 dynamic 类型最适合以下几种场景:
- 与动态数据交互: 如解析 JSON 或 XML 数据。
- 与动态语言集成: 如与使用 DLR 的语言交互。
- 开发 APIs: 当构建需要灵活性的 API 时,可以用动态提供更多的可能性。
总结
C# 的 dynamic 关键字提供了一种在运行时可动态处理数据的能力,使得编写灵活和动态的代码变得简单。在需要动态性以外的情况下,优先考虑使用更安全和高效的静态类型。通过合理使用 dynamic,可以使得代码更加灵活和可维护。
相关文章:

C# 动态类型 Dynamic
文章目录 前言1. 什么是 Dynamic?2. 声明 Dynamic 变量3. Dynamic 的运行时类型检查4. 动态类型与反射的对比5. 使用 Dynamic 进行动态方法调用6. Dynamic 与 原生类型的兼容性7. 动态与 LINQ 的结合8. 结合 DLR 特性9. 动态类型的性能考虑10. 何时使用 Dynamic&…...

Css动画:旋转相册动画效果实现
🌈个人主页:前端青山 🔥系列专栏:Css篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Css篇专栏内容:Css动画:旋转相册动画效果实现 前言 随着Web技术的发展,网页不再局限于静态展示&#…...

Unity 基于Collider 组件在3D 物体表面放置3D 物体
实现 从鼠标点击的屏幕位置发送射线,以射线监测点击到的物体,根据点击物体的法线向量调整放置物体的位置及朝向。 Ray ray Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out RaycastHit hit, 100)) {obj.transform.…...

Hbase整合Mapreduce案例1 hdfs数据上传至hbase中——wordcount
目录 整合结构准备java API 编写pom.xmlMain.javaMap.javaReduce 运行 整合结构 准备 上传hdfs data.txt数据 data.txt I am wunaiieq QAQ 123456 Who I am In todays interconnected world the role of technology cannot be overstated It has revolutionized the way we …...

PyQt 中的无限循环后台任务
在 PyQt 中实现一个后台无限循环任务,需要确保不会阻塞主线程,否则会导致 GUI 无响应。常用的方法是利用 线程(QThread) 或 任务(QRunnable 和 QThreadPool) 来运行后台任务。以下是一些实现方式和关键点&a…...

5G CPE核心器件-基带处理器(三)
5G CPE 核心器件 -5G基带芯片 基带芯片简介基带芯片组成与结构技术特点与发展趋势5G基带芯片是5G CPE中最核心的组件,负责接入5G网络,并进行上下行数据业务传输。移动通信从1G发展到5G,终端形态产生了极大的变化,在集成度、功耗、性能等方面都取得巨大的提升。 基带芯片简…...
鸿蒙next版开发:拍照实现方案(ArkTS)
文章目录 拍照功能开发步骤1. 导入相关接口2. 创建会话3. 配置会话4. 触发拍照5. 监听拍照输出流状态 结语 在HarmonyOS 5.0中,ArkTS提供了一套完整的API来管理相机功能,特别是拍照功能。本文将详细介绍如何在ArkTS中实现拍照功能,并提供代码…...
C++面试突破---C/C++基础
1.C特点 1. C在C语言基础上引入了面对对象的机制,同时也兼容C语言。 2. C有三大特性(1)封装。(2)继承。(3)多态; 3. C语言编写出的程序结构清晰、易于扩充,程序可读性好。…...
项目搭建+修改
一 : 在列表成功回调函数,追加数据中,添加修改的按钮 for (let x of res) {//追加数据$("#table").append(<tr><td><input type"checkbox" class"ck" value"\${x.uid}"></td><td>\${x.uid}</td>…...

每日算法一练:剑指offer——树篇(4)
1.计算二叉树的深度 某公司架构以二叉树形式记录,请返回该公司的层级数。 示例 1: 输入:root [1, 2, 2, 3, null, null, 5, 4, null, null, 4] 输出: 4 解释: 上面示例中的二叉树的最大深度是 4,沿着路径 1 -> 2 -> 3 -&…...

Nginx静态资源配置
基本配置原则 明确资源目录:为不同类型的静态资源指定不同的路径,这样可以避免路径冲突,并且便于管理。正确设置文件权限:确保 Nginx 具有读取静态资源的权限。缓存优化:为静态资源设置缓存头(如 expires&…...

困扰解决:mfc140u.dll丢失的解决方法,多种有效解决方法全解析
当电脑提示“mfc140u.dll丢失”时,这可能会导致某些程序无法正常运行,给用户带来不便。不过,有多种方法可以尝试解决这个问题。这篇文章将以“mfc140u.dll丢失的解决方法”为主题,教大家有效解决mfc140u.dll丢失。 判断是否是“mf…...
D3.js 初探
文章目录 D3.js 简单介绍选择集与方法数据绑定方法选择集添加DOM元素以及删除元素理解update enter 以及 exit关于比例尺layout 布局force layout 坐标轴元素添加动态效果demo1: 绘制简单柱状图 #D3.js 初探 最近在做一个Data Visualization 的项目,由于对最终呈现的…...
linux常用指令 | 适合初学者
linux常用指令 1.ls: 列出当前,目录中的文件和子目录 ls 2.pwd: 显示当前工作目录的路径 pwd3.cd切换工作目录 cd /path/to/director4.mkdir:创建新目录 mkdir directory_name5.rmdir:删除空目录 rmdir directory_name6.rm: 删除文件或目录 rm file_name r…...

用 NotePad++ 运行 Java 程序
安装包 网盘链接 下载得到的安装包: 安装步骤 双击安装包开始安装. 安装完成: 配置编码 用 NotePad 写 Java 程序时, 需要设置编码. 在 设置, 首选项, 新建 中进行设置, 可以对每一个新建的文件起作用. 之前写的文件不起作用. 在文件名处右键, 可以快速打开 CMD 窗口, 且路…...

在 Linux 环境下搭建 OpenLab Web 网站并实现 HTTPS 和访问控制
实验要求 综合练习:请给openlab搭建web网站 网站需求: 1.基于域名[www.openlab.com](http://www.openlab.com)可以访问网站内容为 welcome to openlab!!! 2.给该公司创建三个子界面分别显示学生信息,教学资料和缴费网站,…...

微信小程序wx.showShareMenu配置全局分享功能
在app.js文件中配置如下即可: onLaunch() {//开启分享功能this.overShare()},/*** 开启朋友圈分享功能* 监听路由切换/自动执行*/overShare() {wx.onAppRoute((res) > {// console.log(route, res)let pages getCurrentPages()let view pages[pages.length - …...
机器学习面试八股总结
下面是本人在面试中整理的资料和文字,主要针对机器学习面试八股做浅显的总结,大部分来源于ChatGPT,中间有借鉴一些博主的优质文章,已经在各文中指出原文。有任何问题,欢迎随时不吝指正。 文章系列图像使用动漫 《星游…...

南京邮电大学《2024年812自动控制原理真题》 (完整版)
本文内容,全部选自自动化考研联盟的:《南京邮电大学812自控考研资料》的真题篇。后续会持续更新更多学校,更多年份的真题,记得关注哦~ 目录 2024年真题 Part1:2024年完整版真题 2024年真题...

大数据新视界 -- Hive 数据湖集成与数据治理(下)(26 / 30)
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...

HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...