【C#】使用.net9在C#中向现有对象动态添加属性

在这里插入图片描述

在 C# 中向现有对象动态添加属性并不像在 Python 或 JavaScript 中那样容易,因为 C# 是一种强类型语言。
但是,我们可以通过使用一些技术和库来实现这一点,例如扩展方法、字典等。本文将详细介绍如何在 C# 中实现这一点。ExpandoObject
方法 1:使用ExpandoObject
ExpandoObject是 .NET 提供的特殊类,允许动态添加属性。它实现了接口,这意味着您可以像使用字典一样动态添加属性。IDictionary<string, object>

using System;  
using System.Dynamic;  namespace DynamicPropertiesExample  
{  class Program  {  static void Main(string[] args)  {  dynamic expando = new ExpandoObject();  expando.Name = "John Doe";  expando.Age = 30;  // Add new properties  expando.Country = "USA";  expando.Occupation = "Engineer";  // Print output  Console.WriteLine($"Name: {expando.Name}");  Console.WriteLine($"Age: {expando.Age}");  Console.WriteLine($"Country: {expando.Country}");  Console.WriteLine($"Occupation: {expando.Occupation}");  // Iterate through all properties  foreach (var prop in (IDictionary<string, object>)expando)  {  Console.WriteLine($"{prop.Key}: {prop.Value}");  }  }  }  
}

方法 2:使用匿名类型
匿名类型还可用于动态添加属性,尽管它们通常用于静态方案。这是另一种方法。

using System;  namespace DynamicPropertiesExample  
{  class Program  {  static void Main(string[] args)  {  var person = new { Name = "Jane Doe", Age = 25 };  // Create another object using anonymous type to add new properties  var extendedPerson = new  {  person.Name,  person.Age,  Country = "Canada",  Occupation = "Designer"  };  // Print output  Console.WriteLine($"Name: {extendedPerson.Name}");  Console.WriteLine($"Age: {extendedPerson.Age}");  Console.WriteLine($"Country: {extendedPerson.Country}");  Console.WriteLine($"Occupation: {extendedPerson.Occupation}");  }  }  
}

方法 3:使用扩展方法
虽然扩展方法不能直接添加属性,但它们可以扩展现有类型的功能。同样,我们可以通过组合字典来实现类似的效果。

using System;
using System.Collections.Generic;namespace DynamicPropertiesExample
{public class Person{public string Name { get; set; }public int Age { get; set; }}public static class PersonExtensions{private static readonly Dictionary<Person, Dictionary<string, object>> _additionalProperties = new();public static void AddProperty(this Person person, string propertyName, object value){if (!_additionalProperties.ContainsKey(person)){_additionalProperties[person] = new Dictionary<string, object>();}_additionalProperties[person][propertyName] = value;}public static object GetProperty(this Person person, string propertyName){if (_additionalProperties.ContainsKey(person) && _additionalProperties[person].ContainsKey(propertyName)){return _additionalProperties[person][propertyName];}throw new KeyNotFoundException($"Property '{propertyName}' not found.");}}class Program{static void Main(string[] args){var person = new Person { Name = "Alice", Age = 28 };// Add dynamic propertiesperson.AddProperty("Country", "UK");person.AddProperty("Occupation", "Teacher");// Get and print propertiesConsole.WriteLine($"Name: {person.Name}");Console.WriteLine($"Age: {person.Age}");Console.WriteLine($"Country: {person.GetProperty("Country")}");Console.WriteLine($"Occupation: {person.GetProperty("Occupation")}");}}
}

通过这些方法,我们可以向 C# 中的现有对象动态添加多个属性。尽管 C# 是一种强类型语言,但我们仍然可以通过这些技术实现动态功能,如反射和对象扩展。根据具体需求选择合适的方法可以有效提高代码的灵活性和可扩展性。

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

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

相关文章

Python学习从0到1 day26 第三阶段 Spark ⑤ 搜索引擎日志分析

目录 一、搜索引擎日志分析 二、需求1&#xff1a;热门搜索时间段(小时精度)Top3 实现步骤 三、需求2&#xff1a;打印输出:热门搜索词Top3 实现步骤 四、需求3&#xff1a;打印输出:统计hadoop关键字在哪个时段被搜索最多 实现步骤 五、需求4&#xff1a;将数据转换为JSON格式…

#渗透测试#SRC漏洞挖掘#深入挖掘CSRF漏洞01

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

揭秘云计算 | 2、业务需求推动IT发展

揭秘云计算 | 1、云从哪里来&#xff1f;-CSDN博客https://blog.csdn.net/Ultipa/article/details/143430941?spm1001.2014.3001.5502 书接上文&#xff1a; 过去几十年间IT行业从大型主机过渡到客户端/服务器&#xff0c;再过渡到现如今的万物互联&#xff0c;IT可把控的资…

Grover算法——量子搜索算法

假设N个数据中符合条件的数据有M个&#xff0c;则量子搜索算法的复杂度为&#xff0c;远小于经典算法的复杂度。 黑箱 下面以N2为例&#xff0c;介绍黑箱如何标记符合条件的数据。N2意味着只有两个数据&#xff0c;可以用0和1来表示这两个数据&#xff0c;也就只需要一个量子比…

Ubuntu24.04网络异常与应对方案记录

PS: 参加过408改卷的ZJU ghsongzju.edu.cn 开启嘲讽: 你们知道408有多简单吗&#xff0c;操作系统真实水平自己知道就行&#xff5e;&#xff5e; Requested credits of master in UWSC30&#xff0c;in ZJU24&#xff0c;domestic master is too simple ubuntu安全软件 在 U…

智能的编织:C++中auto的编织艺术

在C的世界里&#xff0c;auto这个关键字就像是一个聪明的助手&#xff0c;它能够自动帮你识别变量的类型&#xff0c;让你的代码更加简洁和清晰。下面&#xff0c;我们就来聊聊auto这个关键字的前世今生&#xff0c;以及它在C11标准中的新用法。 auto的前世 在C11之前&#x…

Spark的Standalone集群环境安装

一.简介 与MR对比&#xff1a; 概念MRYARNSpark Standalone主节点ResourceManagerMaster从节点NodeManagerWorker计算进程MapTask&#xff0c;ReduceTaskExecutor 架构&#xff1a;普通分布式主从架构 主&#xff1a;Master&#xff1a;管理节点&#xff1a;管理从节点、接…

cache(一)基本概念

在知乎发现一份不错得学习资料 请教CPU的cache中关于line,block,index等的理解&#xff1f; PPT 地址 https%3A//cs.slu.edu/%7Efritts/CSCI224_S15/schedule/chap6-cache-memory.pptx 课程主页 https://cs.slu.edu/~fritts/CSCI224_S15/schedule/ 文章目录 1. cache概念2. cac…

前端CSS3 渐变详解

文章目录 CSS3 渐变详解一、引言二、CSS3 渐变基础1、线性渐变1.1、基本线性渐变1.2、改变渐变方向 2、径向渐变2.1、基本径向渐变2.2、设置径向渐变的中心 三、高级渐变技巧1、重复渐变1.1、重复线性渐变1.2、重复径向渐变 四、总结 CSS3 渐变详解 一、引言 在现代网页设计中…

ubuntu下aarch64-linux-gnu(交叉编译) gdb/gdbserver(二)

ubuntu下aarch64-linux-gnu(交叉编译) gdb/gdbserver&#xff08;二&#xff09; 本教程作为gdb/gdbserver编译安装教程的一个补充&#xff0c;教会大家如何使用gdb/gdbserver进行远程调试。 如上图所示&#xff0c;我们需要将编译后的gdbserver上传至目标设备&#xff0c;其上…

(65)使用RLS自适应滤波器进行信道均衡的MATLAB仿真

文章目录 前言一、仿真说明二、码间串扰、色散、与频率选择性衰落1. 码间串扰&#xff08;ISI&#xff09;2. 信道的色散与码间串扰3. 减少ISI的方法 三、MATLAB仿真代码四、仿真结果1.发送16QAM信号的星座图2.信道的频率响应3.接收16QAM信号的星座图4.均衡后16QAM信号的星座图…

【数据分析】如何构建指标体系?

有哪些指标体系搭建模型&#xff1f;五个步骤教你从0开始搭建指标体系 一、企业指标体系搭建存在什么问题 许多企业在搭建数据指标体系时遇到了诸多难题&#xff0c;如问题定位不准确、数据采集不完整、目标不一致、报表无序、指标覆盖不全面以及报表价值未充分利用等。 1、…

【Linux 30】传输层协议 - TCP

文章目录 &#x1f308; 一、TCP 协议介绍⭐ 1. TCP 协议的特点 &#x1f308; 二、TCP 协议格式⭐ 1. TCP 报头中各字段的含义⭐ 2. 各 TCP 标志位的用途⭐ 3. 使用结构体描述 TCP 报头 &#x1f308; 三、TCP 的窗口⭐ 1. TCP 的发送和接收缓冲区⭐ 2. TCP 为什么存在缓冲区⭐…

【Linux杂货铺】IO多路复用

目录 &#x1f308;前言&#x1f308; &#x1f4c1; 五种IO模型 &#x1f4c2; 阻塞IO &#x1f4c2; 非阻塞IO &#x1f4c2; 信号驱动IO &#x1f4c2; 多路复用 &#x1f4c2; 异步IO &#x1f4c1; 非阻塞IO实现 &#x1f4c1; select &#x1f4c2; 接口使用 &#x…

Kafka 的一些问题,夺命15连问

kafka-中的组成员 kafka四大核心 生产者API 允许应用程序发布记录流至一个或者多个kafka的主题&#xff08;topics&#xff09;。 消费者API 允许应用程序订阅一个或者多个主题&#xff0c;并处理这些主题接收到的记录流 StreamsAPI 允许应用程序充当流处理器&#xff08;s…

ANNOVAR下载

1.官网 https://annovar.openbioinformatics.org/en/latest/user-guide/startup/ 都填英文 要不然会报错 tar -xzvf annovar.latest.tar.gztree . ├── annotate_variation.pl ├── coding_change.pl ├── convert2annovar.pl ├── example │ ├── ex1.avinput…

集群架构中Lua脚本的限制以及出现的报错

&#x1f680; 博主介绍&#xff1a;大家好&#xff0c;我是无休居士&#xff01;一枚任职于一线Top3互联网大厂的Java开发工程师&#xff01; &#x1f680; &#x1f31f; 在这里&#xff0c;你将找到通往Java技术大门的钥匙。作为一个爱敲代码技术人&#xff0c;我不仅热衷…

大语言模型:解锁自然语言处理的无限可能

0.引言 在当今的科技时代&#xff0c;自然语言处理技术正以前所未有的速度发展&#xff0c;语言大模型作为其中的核心力量&#xff0c;对各个领域产生了深远的影响。本文旨在探讨语言大模型的发展历程、核心技术以及广泛的应用场景&#xff0c;以帮助读者更好地理解这一前沿技…

MATLAB实现智能水滴算法(Intelligent Water Drops Algorithm, IWDA)

1.智能水滴算法介绍 智能水滴算法&#xff08;Intelligent Water Drops Algorithm&#xff0c;IWDA&#xff09;是一种基于水滴特性的智能优化算法&#xff0c;它借鉴了水滴在自然界中的运动和形态变化规律&#xff0c;通过模拟水滴的形成、发展和消亡过程&#xff0c;实现问题…

【计网】基于TCP协议的Echo Server程序实现与多版本测试

目录 前言&#xff1a; 1、InitServer类的实现 1.1. 创建流式套接字 1.2. bind 绑定一个固定的网络地址和端口号 1.3.listen监听机制 1.4.完整代码 2. 循环接收接口与服务接口 2.1.accept函数讲解 讲个商场拉客的故事方便我们理解&#xff1a; 2.2.服务接口实现 3.服…