考慮一個場景,您需要建立一個動態對象,其中的屬性可以在運行時動態添加。您可以利用 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中文網其他相關文章!