L'ajout de propriétés dynamiques aux objets au moment de l'exécution est une exigence courante dans de nombreuses applications. Une approche courante pour y parvenir consiste à utiliser un dictionnaire ou une collection de paramètres. Cependant, pour les scénarios dans lesquels le nombre et les noms des propriétés sont inconnus au préalable, cette approche ne suffit pas.
Le .NET Framework fournit une solution intégrée à ce problème : ExpandoObject. Cette classe vous permet de créer des objets dynamiques auxquels vous pouvez ajouter et supprimer des propriétés au moment de l'exécution.
// 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);
Pour des scénarios plus compliqués, vous souhaiterez peut-être créer votre propre dynamique objet qui implémente la classe DynamicObject. Cela vous donne plus de contrôle sur la façon dont les demandes de membres dynamiques sont traitées.
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; } } }
En utilisant cette approche, vous pouvez créer des objets dynamiques avec toutes les propriétés souhaitées :
var dyn = GetDynamicObject(new Dictionary<string, object>() { { "prop1", 12 } }); Console.WriteLine(dyn.prop1); dyn.prop1 = 150;
Attention : Lorsque vous utilisez des objets dynamiques, sachez que le compilateur ne pourra pas vérifier vos appels dynamiques et que vous pourriez rencontrer des erreurs d'exécution ou un manque d'intellisense soutien.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!