news 2026/2/10 7:11:45

<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/2/10 6:58:59

<span class=“js_title_inner“>一键部署!OpenCloudOS 多项开源技术打造 “开箱即用” 的 AI 支撑底座</span>

12月6日&#xff0c;在以“以生态之力让OS更懂未来”为主题的 2025 OpenCloudOS 操作系统生态大会上&#xff0c;OpenCloudOS 社区联动昇腾、海光、AMD、沐曦、昆仑芯、vLLM、SGLang、作业帮以及腾讯云&#xff0c;共同发布了 OpenCloudOS Infra 智能基座。这一重磅发布旨在系统…

作者头像 李华
网站建设 2026/2/3 10:43:34

Linus 用 AI 写 Python 代码,还开源了!

&#x1f447;我的小册 54章教程:(小白零基础用Python量化股票分析小册) ,原价299&#xff0c;限时特价2杯咖啡&#xff0c;满100人涨10元。 转自&#xff1a;CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 两个月前&#xff0c;在 Linux Foundation 的开源峰会上&#…

作者头像 李华
网站建设 2026/2/4 14:41:34

【小程序毕设源码分享】基于springboot+小程序的公开课管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

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

作者头像 李华
网站建设 2026/2/9 23:39:06

【小程序毕设全套源码+文档】基于微信小程序的影音点评系统设计与实现(丰富项目+远程调试+讲解+定制)

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

作者头像 李华
网站建设 2026/2/7 1:48:06

Vue3 + Element Plus 项目中使用 html2canvas 截图实战详解

在现代 Web 应用开发中&#xff0c;常常需要将页面中的某一部分内容生成图片&#xff0c;用于保存、打印或上传。html2canvas 是一个非常流行的前端库&#xff0c;它能将 HTML 元素“绘制”成 Canvas&#xff0c;进而导出为图片。本文将结合实际 Vue3 Element Plus 项目代码&a…

作者头像 李华
网站建设 2026/2/8 10:11:42

wait和notify这个为什么要在synchronized代码块中?

一、核心结论先明确wait()和notify()的本质是操作对象的监视器&#xff08;Monitor&#xff09;&#xff0c;而只有当前线程获取到该对象的 Monitor 锁&#xff08;也就是进入synchronized代码块 / 方法&#xff09;&#xff0c;才能合法操作这个监视器。如果不在synchronized中…

作者头像 李华