自学内容网 自学内容网

【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 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# 是一种强类型语言,但我们仍然可以通过这些技术实现动态功能,如反射和对象扩展。根据具体需求选择合适的方法可以有效提高代码的灵活性和可扩展性。


原文地址:https://blog.csdn.net/david_520042/article/details/143593125

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!