首页 > 后端开发 > C++ > 如何在运行时动态添加 C# 属性而不使用集合?

如何在运行时动态添加 C# 属性而不使用集合?

Barbara Streisand
发布: 2025-01-02 21:12:40
原创
398 人浏览过

How to Dynamically Add C# Properties at Runtime Without Using Collections?

在运行时动态添加 C# 属性而不使用集合

考虑一个场景,您需要创建一个动态对象,其中的属性可以在运行时动态添加。您可以利用 ExpandoObject 类,而不是使用字典或参数集合。

ExpandoObject

ExpandoObject 允许您在运行时添加和删除其实例的成员,启用动态绑定功能。它提供了一种动态操作属性的便捷方法,如以下示例所示:

dynamic dynObject = new ExpandoObject();
dynObject.SomeDynamicProperty = "Hello!";
登录后复制

自定义动态对象

基于 ExpandoObject 方法,您可以创建管理动态属性的检索和设置的自定义动态对象。下面的代码演示了这个概念:

public static dynamic GetDynamicObject(Dictionary<string, object> properties)
{
    return new MyDynObject(properties);
}

public sealed class MyDynObject : DynamicObject
{
    private readonly Dictionary<string, object> _properties;

    public MyDynObject(Dictionary<string, object> properties)
    {
        _properties = properties;
    }

    public override IEnumerable<string> GetDynamicMemberNames()
    {
        return _properties.Keys;
    }

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        if (_properties.ContainsKey(binder.Name))
        {
            result = _properties[binder.Name];
            return true;
        }
        else
        {
            result = null;
            return false;
        }
    }

    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        if (_properties.ContainsKey(binder.Name))
        {
            _properties[binder.Name] = value;
            return true;
        }
        else
        {
            return false;
        }
    }
}
登录后复制

通过实现 DynamicObject 接口,您可以完全控制动态成员访问机制。这允许您为动态对象实现自定义规则和行为。

用法

自定义动态对象就位后,您可以添加属性并在以下位置检索它们:运行时:

var dyn = GetDynamicObject(new Dictionary<string, object>
{
    { "prop1", 12 },
});

Console.WriteLine(dyn.prop1);
dyn.prop1 = 150;
登录后复制

注意:

动态对象功能强大,但必须谨慎使用。编译器无法验证动态调用,如果不小心,可能会遇到运行时错误。在生产代码中使用它们之前,了解底层机制和潜在问题至关重要。

以上是如何在运行时动态添加 C# 属性而不使用集合?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板