当前位置: 首页 > news >正文

System.Dynamic.ExpandoObject的使用说明

官方文档

ExpandoObject 类 (System.Dynamic) | Microsoft Learn

https://learn.microsoft.com/zh-cn/dotnet/api/system.dynamic.expandoobject?view=net-8.0

System.Dynamic.ExpandoObject 类 - .NET | Microsoft Learn

https://learn.microsoft.com/zh-cn/dotnet/fundamentals/runtime-libraries/system-dynamic-expandoobject

介绍

如果看不懂,没关系,可以看下面的示例代码

通过 ExpandoObject 该类,你可以在运行时添加和删除其实例的成员,以及设置和获取这些成员的值。 此类支持动态绑定,因此可以使用标准语法,例如 sampleObject.sampleMember ,而不是更复杂的 sampleObject.GetAttribute("sampleMember")语法。

该 ExpandoObject 类实现标准动态语言运行时 (DLR) 接口 IDynamicMetaObjectProvider,使你可以在支持 DLR 互操作性模型的语言之间共享类的 ExpandoObject 实例。 例如,可以在 C# 中创建类的 ExpandoObject 实例,然后将其传递给 IronPython 函数。 有关详细信息,请参阅 动态语言运行时概述 和 ExpandoObject 简介。

该 ExpandoObject 类是动态对象概念的实现,可实现获取、设置和调用成员。 如果要定义具有其自己的动态调度语义的类型,请使用该 DynamicObject 类。 如果要定义动态对象如何参与互操作性协议并管理 DLR 快速动态调度缓存,请创建自己的接口实现 IDynamicMetaObjectProvider 。

示例代码

在 C# 中,若要为类的ExpandoObject实例启用后期绑定,必须使用dynamic关键字 (keyword)。 有关更多信息,请参见使用类型 dynamic。

创建实例

dynamic sampleObject = new ExpandoObject();

添加新成员

可以将属性、方法和事件添加到类的 ExpandoObject 实例。

下面的代码示例演示如何向类的 ExpandoObject 实例添加新属性。

sampleObject.test = "Dynamic Property";
Console.WriteLine(sampleObject.test);
Console.WriteLine(sampleObject.test.GetType());

作为参数传递

class Program
{static void Main(string[] args){dynamic employee, manager;employee = new ExpandoObject();employee.Name = "John Smith";employee.Age = 33;manager = new ExpandoObject();manager.Name = "Allison Brown";manager.Age = 42;manager.TeamSize = 10;WritePerson(manager);WritePerson(employee);}private static void WritePerson(dynamic person){Console.WriteLine("{0} is {1} years old.",person.Name, person.Age); }
} 

【*重点】枚举和删除成员

ExpandoObject 类实现 IDictionary<String, Object> 接口。 这样就可以在运行时枚举添加到类实例 ExpandoObject 的成员。 如果在编译时不知道实例可能具有的成员,这可能很有用。

下面的代码示例演示如何将类IDictionary<TKey,TValue>的ExpandoObject实例强制转换为接口并枚举实例的成员。

dynamic employee = new ExpandoObject();
employee.Name = "John Smith";
employee.Age = 33;foreach (var property in (IDictionary<String, Object>)employee)
{Console.WriteLine(property.Key + ": " + property.Value);
} 

在不使用语法删除成员(如 C# 和 Visual Basic)的语言中,可以通过隐式将接口的ExpandoObjectIDictionary<String, Object>实例强制转换为接口,然后将成员删除为键/值对来删除成员。 这在下面的示例中显示。

dynamic employee = new ExpandoObject();
employee.Name = "John Smith";
((IDictionary<String, Object>)employee).Remove("Name");

【*重点】既然是这样,我们可以这样操作,来读取值

假设【users】的类型是IEnumerable<dynamic>,他的本质是一个List<dynamic>集合(虽然这样说不严谨,你可以先这样理解);他里面的每项元素的类型是System.Dynamic.ExpandoObject

我们可以这样读取值

foreach (IDictionary<string, object> user in users)
{foreach (var item in user){Console.WriteLine($"Key:{item.Key}--Value:{item.Value}");}
}

解释:

假设【users】的类型是IEnumerable<dynamic>,他的本质是一个List<dynamic>集合(虽然这样说不严谨,你可以先这样理解)

我为什么这样说呢?

下面代码是list源码,我们可以看到它继承了 IEnumerable<T>和IEnumerable;

那么IEnumerable<dynamic>就等于 IEnumerable<T>;

所以我说:IEnumerable<dynamic>类型,他的本质是一个List<dynamic>集合; 这个理解也算合理

public class List<T> : ICollection<T>, IEnumerable<T>, IEnumerable, IList<T>, IReadOnlyCollection<T>, IReadOnlyList<T>, ICollection, IList
{ public List(); public List(int capacity);
}

相关文章:

System.Dynamic.ExpandoObject的使用说明

官方文档 ExpandoObject 类 (System.Dynamic) | Microsoft Learn https://learn.microsoft.com/zh-cn/dotnet/api/system.dynamic.expandoobject?viewnet-8.0 System.Dynamic.ExpandoObject 类 - .NET | Microsoft Learn https://learn.microsoft.com/zh-cn/dotnet/fundame…...

adb之ps命令用法

目录 前言一、命令参数二、输出结果含义 前言 在adb shell终端&#xff0c;输入 ps&#xff0c;可查看手机当前所有的进程状态&#xff0c;其中ps的英文全称是Process Status。 ps命令对于分析系统异常情况时都是必备的技能&#xff0c;需要通过这个简单命令来查看系统真实的状…...

Ubuntu-24.04-live-server-amd64安装界面中文版

系列文章目录 Ubuntu安装qemu-guest-agent Ubuntu-24.04-live-server-amd64启用ssh Ubuntu乌班图安装VIM文本编辑器工具 文章目录 系列文章目录前言一、准备工作二、开始安装三、测试效果总结 前言 Centos结束&#xff0c;转战Ubuntu。我之所以写这篇文章&#xff0c;是因为我…...

Git的3个主要区域

一般来说&#xff0c;日常使用只要记住下图6个命令&#xff0c;就可以了。但是熟练使用&#xff0c;恐怕要记住60&#xff5e;100个命令。 下面是我整理的常用 Git 命令清单。几个专用名词的译名如下。 Workspace&#xff1a;工作区 Index / Stage&#xff1a;暂存区 Reposito…...

【操作系统】操作系统实验02-生产者消费者程序改进

1. 说明文档中原有程序实现的功能、实现方法。&#xff08;用语言、程序流程图、为原有程序添加注释等方式均可&#xff09; 1.//const.h 2.//定义宏变量 3.#ifndef CONST_H 4.#define CONST_H 5. 6.#define TRUE 1 7.#define FALSE 0 8.#define ERROR 0 9.#define OVERFLOW -…...

TCP协议是安全的吗?

不安全 虽然 TCP 提供了一种可靠且高效的数据传输方式&#xff0c;但它不提供任何加密或身份验证机制来保护数据。因此&#xff0c;传输的数据可能会被未经授权的用户拦截和读取&#xff0c;而且其真实性无法验证。 因此&#xff0c;为了确保 TCP 通信的安全&#xff0c;必须…...

c语言回顾-结构体(2)

前言 前面讲了结构体的概念&#xff0c;定义&#xff0c;赋值&#xff0c;访问等知识&#xff0c;本节内容小编将讲解结构体的内存大小的计算以及通过结构体实现位段&#xff0c;话不多说&#xff0c;直接上干货&#xff01;&#xff01;&#xff01; 1.结构体内存对齐 说到计…...

Prometheus常见exporter安装部署

Prometheus常见exporter安装部署 在稳定性环境的监控当中需要收集各种各样的数据&#xff0c;这样的数据收集是通过各种exporter进行的&#xff0c;在这里我们进行最常用稳定性数据的收集exporter安装部署介绍。 node_exporter安装部署 node_exporter主要监控服务器本身的一…...

DGit的使用

将Remix连接到远程Git仓库 1.指定克隆的分支和深度 2.清理&#xff0c;如果您不在工作区上工作&#xff0c;请将其删除或推送至 GitHub 或 IPFS 以确保安全。 为了进行推送和拉取&#xff0c;你需要一个 PAT — 个人访问令牌 当使用 dGIT 插件在 GitHub 上推送、拉取、访问私…...

ElasticSearch学习篇13_《检索技术核心20讲》进阶篇之LSM树

背景 学习极客实践课程《检索技术核心20讲》https://time.geekbang.org/column/article/215243&#xff0c;文档形式记录笔记。 内容 磁盘和内存数据读取特点 工业界中数据量往往很庞大&#xff0c;比如数据无法全部加载进内存&#xff0c;无法支持索引的高效实时更新&…...

简单好用的C++日志库spdlog使用示例

文章目录 前言一、spdlog的日志风格fmt风格printf风格 二、日志格式pattern三、sink&#xff0c;多端写入四、异步写入五、注意事项六、自己封装了的代码usespdlog.h封装代码解释使用示例 前言 C日志库有很多&#xff0c;glog&#xff0c;log4cpp&#xff0c;easylogging, eas…...

python 方法运行计时装饰模式实现

在代码开发过程中&#xff0c;需要记录方法的执行时间&#xff0c;每个方法都硬代码也可以实现&#xff0c;但是不是最好的方式&#xff0c;考虑到设计模式和模版代码&#xff0c;通过装饰模式实现方法运行计时 在Python中&#xff0c;装饰器可以接受参数&#xff0c;这样可以…...

【权威出版/投稿优惠】2024年水利水电与能源环境科学国际会议(WRHEES 2024)

2024 International Conference on Water Resources, Hydropower, Energy and Environmental Science 2024年水利水电与能源环境科学国际会议 【会议信息】 会议简称&#xff1a;WRHEES 2024 大会时间&#xff1a;点击查看 截稿时间&#xff1a;点击查看 大会地点&#xff1a;…...

阿赵UE引擎C++编程学习笔记——场景加载和切换

大家好&#xff0c;我是阿赵。   继续学习UE引擎&#xff0c;这次来学习一下切换和加载场景的各种做法。 一、 蓝图实现 1、 切换关卡 所谓切换关卡&#xff0c;就是从当前关卡进入到一个新的关卡&#xff0c; 旧关卡的数据将会被放弃。进入新的关卡后&#xff0c;将会执行…...

【LLM之RAG】RAFT论文阅读笔记

研究背景 论文针对的主要问题是如何将预训练的大型语言模型&#xff08;LLMs&#xff09;适应特定领域的检索增强生成&#xff08;RAG&#xff09;。这些模型通常在广泛的文本数据上进行预训练&#xff0c;已经表现出在广义知识推理任务上的优越性能。然而&#xff0c;在特定领…...

【Android】使用Binder(AIDL)实现利用自定义Bean进行的进程间通信(二)

项目前置 这是我之前写的关于Binder的一些知识点和使用基本数据类型在通信的文章&#xff0c;感兴趣的可以看一下: Binder&#xff08;一&#xff09;Binder的介绍和AIDL使用Binder的实例 项目目标 在两个APP之间进行数据传递&#xff0c;使用Android推荐的Binder通讯&#…...

HTTP中get与post的区别?在传输数据类型上有什么区别?【面试】

HTTP中的GET和POST是两种最常见的请求方法&#xff0c;它们在数据传输和使用场景上有一些关键的区别&#xff1a; GET请求&#xff1a; 数据传输方式&#xff1a;GET请求将数据附加在URL之后&#xff0c;形成查询字符串&#xff08;namevalue的形式&#xff09;&#xff0c;数…...

「51媒体-年中大促」天津有哪些媒体资源-媒体宣传服务公司

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 天津的媒体资源相当丰富&#xff0c;涵盖了报纸、电视、广播、新闻门户网站、央媒驻天津机构、视频媒体以及全国媒体资源等多个方面。以下是详细的媒体资源分类和具体信息&#xff1a; 一…...

Thinkphp校园新闻发布系统源码 毕业设计项目实例

Thinkphp校园新闻发布系统源码 毕业设计项目实例 校园新闻发布系统模块&#xff1a; 用户模块&#xff1a;注册&#xff0c;登陆&#xff0c;查看个人信息&#xff0c;修改个人信息&#xff0c;站内搜索&#xff0c;新闻浏览等功能&#xff0c; 后台管理员模块&#xff1a;会员…...

前端老古董execCommand——操作 选中文本 样式

文章目录 ⭐前言⭐exe command api用法&#x1f496; example示例&#x1f496; 测试效果 ⭐execommand和getSelection 的联系⭐总结⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享关于 前端老古董execCommand——操作选中文本。 execommand 当一个 HTML 文…...

elementui写一个自定义的rangeInput的组件

组件定义 使用el-row确保元素都在一行上对外暴露的prop是minValue和maxValue&#xff0c;但是不建议直接使用&#xff0c;使用计算属性minValueComputed和maxValueComputed更改计算属性的值的不要直接更改计算属性&#xff0c;也不要直接更改原本的prop&#xff0c;通知外层的父…...

护眼灯哪些牌子好?一文刨析护眼灯怎么选择!

护眼灯哪些牌子好&#xff1f;护眼台灯作为对抗视力挑战的一种方法&#xff0c;逐渐赢得了众多家长的青睐。这些台灯利用尖端光学技术&#xff0c;发出柔和且无刺激的照明&#xff0c;有助于保护眼睛不受伤害。它们不但可以调节亮度和色温&#xff0c;打造一个舒适且自然的阅读…...

抖音短剧看剧系统是怎么做的?怎么样搭建上线运营?

前言&#xff1a; 当前热门短剧已深入大家的日常&#xff0c;针对一些好的短剧更是吸金无数。今天给大家介绍一下短剧这个项目整个运作模式。 一、一部短剧是怎么样呈现到观众眼前的&#xff1f; 首先影视作品公司拍摄剪辑好短剧 &#xff0c;弄好一切审核后&#xff0c;放到…...

2024.06.06校招 实习 内推 面经

绿*泡*泡VX&#xff1a; neituijunsir 交流*裙 &#xff0c;内推/实习/校招汇总表格 1、校招 | 追觅科技2025届校园招聘/正式启动&#xff01; 校招 | 追觅科技2025届校园招聘正式启动&#xff01; 2、校招&实习&社招 | 博世海外招聘—德国/专场正式启动&#xff0…...

神经网络模型---ResNet

一、ResNet 1.导入包 import tensorflow as tf from tensorflow.keras import layers, models, datasets, optimizersoptimizers是用于更新模型参数以最小化损失函数的算法 2.加载数据集、归一化、转为独热编码的内容一致 3.增加颜色通道 train_images train_images[...,…...

Linux之网络编程

Linux之网络编程 TCP协议 TCP(Transmission ControlProtocol) : 传输控制协议&#xff0c;是一个 面向连接的、可靠的、基于字节流的传输层的协议。TCP 协议建立的是一种点到点的&#xff0c;一对一的可靠连接协议 特点&#xff1a; 数据无丢失数据无失序数据无错误数据无重…...

opencascade AIS_InteractiveContext源码学习1

AIS_InteractiveContext 前言 交互上下文&#xff08;Interactive Context&#xff09;允许您在一个或多个视图器中管理交互对象的图形行为和选择。类方法使这一操作非常透明。需要记住的是&#xff0c;对于已经被交互上下文识别的交互对象&#xff0c;必须使用上下文方法进行…...

TIA博途 WinCC下载到面板时,提示错误消息:“装载过程终止由于传输错误:8020AB001A06FFF4!”的解决办法

TIA博途 WinCC下载到面板时,提示错误消息:“装载过程终止由于传输错误:8020AB001A06FFF4!”的解决办法 这个错误信息是由于缺少设备镜像无法下载到操作面板而导致的。 当使用 TIA V15.1 Update 4 和 Update 5 组态 TP1000F Mobile 时,请遵守特别注意事项。 问题 在编译一个…...

【MySQL】聊聊数据库是如何保证数据不丢的

对于一个存储系统来说&#xff0c;其中比较关键的核心组件包含&#xff0c;网络、存储模型、持久化、数据结构等。而数据如何保证不丢失&#xff0c;对于不同的存储系统来说&#xff0c;比如Redis采用AOF和RDB的方式进行混合使用&#xff0c;而MySQL采用日志进行保证。也就是re…...

GitLab教程(四):分支(branch)和合并(merge)

文章目录 1.分支&#xff08;branch&#xff09;&#xff08;1&#xff09;分支的概念&#xff08;2&#xff09;branch命令 2.合并&#xff08;merge&#xff09;&#xff08;1&#xff09;三个命令pullfetchmergegit fetchgit mergegit pull &#xff08;2&#xff09;合并冲…...

正邦做网站多少钱/百度学术官网论文查重免费

Lenovo联想手机驱动官方版是款针对联想手机的用户们打造的驱动程序。Lenovo联想手机驱动电脑版是用户在用联想手机连接电脑时必不可少的一款驱动程序&#xff0c;可以让用户放心连接电脑。Lenovo联想手机驱动是用电脑下载手机软件和刷机必备的驱动程序&#xff0c;用户可以通过…...

网站建设中有关数据库问题/优化营商环境心得体会

当我们需要创建 Elasticsearch 索引时&#xff0c;数据源通常没有规范化&#xff0c;无法直接导入。 原始数据可以存储在数据库、原始 CSV/XML 文件中&#xff0c;甚至可以从第三方 API 获取。 在这种情况下&#xff0c;我们需要对数据进行预处理以使其与 Bulk API 一起使用。 …...

人工智能平台/武汉seo技术

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2021年危险化学品经营单位安全管理人员新版试题及危险化学品经营单位安全管理人员实操考试视频&#xff0c;包含危险化学品经营单位安全管理人员新版试题答案和解析及危险化学品经营单位安全管理人员实操考试视频练习…...

如何建设阿里巴巴网站/博客网站注册

有的时候我们需要集成ListActivity&#xff0c;注意点1&#xff0c;这个时候我们的xml中的<ListView>标签中的id属性不能够随便自己命名&#xff0c;而是要固定为android:id"id/android:list"&#xff0c;具体如下&#xff1a; main3.xml: 1 <?xml version…...

怎么做有趣的微视频网站/百度广告联盟价格

事务 1. 事务的几个概念 &#xff08;1&#xff09;脏读&#xff1a;对于两个事务t1,t2。t1先读取了已经被t2更新但是没有被提交的字段&#xff0c;那么在t2提交之后&#xff0c;数据就会发生改变。 &#xff08;2&#xff09;不可重复读&#xff1a;对于两个事务t1,t2。t1读…...

传媒建站推荐/市场调研报告800字

递归函数 了解什么是递归 &#xff1a; 在函数中调用自身函数 最大递归深度默认是997/998 —— 是python从内存角度出发做的限制 能看懂递归 能知道递归的应用场景 初识递归 —— 算法 —— 二分查找算法 三级菜单 —— 递归实现手动设置递归深度import syssys.setr…...