在運行時向物件添加動態屬性是許多應用程式中的常見要求。實現此目的的常見方法是使用字典或參數集合。但是,對於事先未知屬性數量和名稱的情況,這種方法就不夠了。
.NET Framework 為這個問題提供了一個內建的解決方案:ExpandoObject。此類別可讓您建立動態對象,您可以在執行時新增和刪除屬性。
// Create a dynamic object dynamic dynObject = new ExpandoObject(); // Add dynamic properties dynObject.SomeDynamicProperty = "Hello!"; // Execute dynamic actions dynObject.SomeDynamicAction = (msg) => { Console.WriteLine(msg); }; dynObject.SomeDynamicAction(dynObject.SomeDynamicProperty);
對於更複雜的場景,您可能需要建立自己的動態物件實作 DynamicObject 類別的物件。這使您可以更好地控制動態成員請求的處理方式。
public sealed class MyDynObject : DynamicObject { // Member dictionary private readonly Dictionary<string, object> _properties; public MyDynObject(Dictionary<string, object> properties) { _properties = properties; } // Get dynamic member names public override IEnumerable<string> GetDynamicMemberNames() { return _properties.Keys; } // Try to get a dynamic member 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; } } // Try to set a dynamic member public override bool TrySetMember(SetMemberBinder binder, object value) { if (_properties.ContainsKey(binder.Name)) { _properties[binder.Name] = value; return true; } else { return false; } } }
使用此方法,您可以建立具有任何所需屬性的動態物件:
var dyn = GetDynamicObject(new Dictionary<string, object>() { { "prop1", 12 } }); Console.WriteLine(dyn.prop1); dyn.prop1 = 150;
警告: 使用動態物件時,請注意編譯器將無法驗證您的動態調用,並且您可能會遇到運行時錯誤或缺乏智慧感知支援。
以上是如何在運行時動態新增 C# 屬性?的詳細內容。更多資訊請關注PHP中文網其他相關文章!