Pertimbangkan senario di mana anda perlu mencipta objek dinamik dengan sifat yang boleh ditambah secara dinamik pada masa jalan. Daripada menggunakan kamus atau koleksi parameter, anda boleh memanfaatkan kelas ExpandoObject.
ExpandoObject
ExpandoObject membenarkan anda menambah dan mengalih keluar ahli kejadiannya pada masa jalan, membolehkan keupayaan mengikat dinamik. Ia menyediakan cara mudah untuk memanipulasi sifat secara dinamik, seperti yang dilihat dalam contoh berikut:
dynamic dynObject = new ExpandoObject(); dynObject.SomeDynamicProperty = "Hello!";
Objek Dinamik Tersuai
Membina pada pendekatan ExpandoObject, anda boleh mencipta objek dinamik tersuai yang menguruskan pengambilan semula dan penetapan sifat dinamik. Kod berikut menunjukkan konsep ini:
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; } } }
Dengan melaksanakan antara muka DynamicObject, anda mendapat kawalan penuh ke atas mekanisme akses ahli dinamik. Ini membolehkan anda melaksanakan peraturan dan gelagat tersuai untuk objek dinamik anda.
Penggunaan
Dengan objek dinamik tersuai anda tersedia, anda boleh menambah sifat dan mendapatkannya di masa jalan:
var dyn = GetDynamicObject(new Dictionary<string, object> { { "prop1", 12 }, }); Console.WriteLine(dyn.prop1); dyn.prop1 = 150;
Nota:
Objek dinamik berkuasa tetapi mesti digunakan dengan berhati-hati. Pengkompil tidak boleh mengesahkan panggilan dinamik dan anda mungkin menghadapi ralat masa jalan jika anda tidak berhati-hati. Adalah penting untuk memahami mekanisme asas dan potensi isu sebelum menggunakannya dalam kod pengeluaran.
Atas ialah kandungan terperinci Bagaimana untuk Menambah Sifat C# secara Dinamik pada Runtime Tanpa Menggunakan Koleksi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!