Menambah sifat dinamik pada objek pada masa jalan ialah keperluan biasa dalam banyak aplikasi. Pendekatan biasa untuk mencapai ini ialah menggunakan kamus atau koleksi parameter. Walau bagaimanapun, untuk senario di mana bilangan dan nama sifat tidak diketahui terlebih dahulu, pendekatan ini kurang.
Rangka Kerja .NET menyediakan penyelesaian terbina dalam untuk masalah ini: ExpandoObject. Kelas ini membenarkan anda mencipta objek dinamik yang mana anda boleh menambah dan mengalih keluar sifat pada masa jalan.
// 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);
Untuk senario yang lebih rumit, anda mungkin mahu mencipta dinamik anda sendiri objek yang melaksanakan kelas DynamicObject. Ini memberi anda lebih kawalan ke atas cara permintaan ahli dinamik dikendalikan.
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; } } }
Menggunakan pendekatan ini, anda boleh mencipta objek dinamik dengan sebarang sifat yang dikehendaki:
var dyn = GetDynamicObject(new Dictionary<string, object>() { { "prop1", 12 } }); Console.WriteLine(dyn.prop1); dyn.prop1 = 150;
Awas: Apabila menggunakan objek dinamik, ambil perhatian bahawa pengkompil tidak akan dapat mengesahkan panggilan dinamik anda dan anda mungkin menghadapi ralat masa jalan atau kekurangan sokongan intellisense.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menambah Sifat C# Secara Dinamik pada Runtime?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!