首頁 > 後端開發 > 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
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板