news 2026/4/16 17:05:13

<span class=“js_title_inner“>使用.net9在C#中向现有对象动态添加属性</span>

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
<span class=“js_title_inner“>使用.net9在C#中向现有对象动态添加属性</span>

在 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 properties person.AddProperty("Country", "UK"); person.AddProperty("Occupation", "Teacher"); // Get and print properties Console.WriteLine($"Name: {person.Name}"); Console.WriteLine($"Age: {person.Age}"); Console.WriteLine($"Country: {person.GetProperty("Country")}"); Console.WriteLine($"Occupation: {person.GetProperty("Occupation")}"); } } }

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

如果你喜欢我的文章,请给我一个赞!谢谢

寒冰 出处:mp.weixin.qq.com/s/4xdSKrrYBoi2JA0F4VzztA

- EOF -

技术群:添加小编微信dotnet999

公众号:dotnet讲堂

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 12:20:32

学术导航仪:解锁书匠策AI的期刊论文“超能力”

在学术江湖中&#xff0c;期刊论文是科研成果的“终极勋章”&#xff0c;但写作过程却像一场“闯关游戏”——选题撞车、逻辑混乱、格式错漏、查重焦虑……每个环节都可能让研究者“卡关”。如今&#xff0c;一款名为书匠策AI的智能工具&#xff08;官网&#xff1a;www.shujia…

作者头像 李华
网站建设 2026/4/16 9:50:19

CVE-2025-55752_ Apache Tomcat 安全漏洞

CVSS评分&#xff1a;7.5 CVE-2025-55752_ Apache Tomcat 安全漏洞1. 漏洞原理2. 漏洞危害3. 漏洞修复升级版本修复配置修复1. 漏洞原理 CVE-2025-55752 是 Apache Tomcat 中一个 相对路径遍历&#xff08;Relative Path Traversal&#xff09;漏洞。简单来说&#xff0c;这个…

作者头像 李华
网站建设 2026/4/16 14:06:35

【小程序毕设全套源码+文档】基于微信小程序的传统戏曲推广微信小程序设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/16 14:06:20

2026年软件测试公众号爆款内容解析与实战转化

一、热度巅峰&#xff1a;三大内容类型的技术驱动力 2026年软件测试公众号的流量高地被三类内容主导&#xff0c;其共性在于直击工程实践痛点并配备可落地方案&#xff1a; AI工具效能突破教程&#xff08;占热门内容60%&#xff09; 爆款逻辑&#xff1a;通过量化对比解决测试…

作者头像 李华
网站建设 2026/4/15 14:42:37

【Rust日报】来自 CrabNebula 的 Tauri LLM 插件官方

来自 CrabNebula 的 Tauri LLM 插件官方刚刚看到一个非常令人兴奋的“官方”Tauri插件发布了&#xff0c;似乎是由CrabNebula的开发者制作的&#xff0c;这意味着它会得到很好的支持。这是一个用于在本地加载和操作大多数LLM的插件。https://github.com/crabnebula-dev/tauri-p…

作者头像 李华
网站建设 2026/4/16 12:25:41

Flutter艺术探索-Flutter CI/CD配置:GitHub Actions自动化部署

Flutter CI/CD 配置指南&#xff1a;使用 GitHub Actions 实现自动化部署 引言 如今移动应用迭代速度越来越快&#xff0c;持续集成与持续部署&#xff08;CI/CD&#xff09;早就不再是“加分项”&#xff0c;而是保障开发效率和代码质量的标准实践。对于 Flutter 开发者来说…

作者头像 李华