J'essaie de comprendre le type DynamicObject. J'ai trouvé cet article MSDN très concis et clair sur la façon de créer et d'utiliser DynamicObject:
http://msdn.Microsoft.com/en-us/library/system.dynamic.dynamicobject.aspx
L'article contient une classe DynamicDictionary simple qui hérite de DynamicObject.
Maintenant, je veux parcourir mes propriétés DynamicObject créées dynamiquement:
dynamic d = new DynamicDictionary();
d.Name = "Myname";
d.Number = 1080;
foreach (var prop in d.GetType().GetProperties())
{
Console.Write prop.Key;
Console.Write prop.Value;
}
De toute évidence, cela ne fonctionne pas. Je veux apprendre à faire cela sans changer ma classe DynamicDictionary, car j'essaie vraiment d'apprendre à l'utiliser pour toutes sortes d'objets existants qui héritent de DynamicObject.
La réflexion est-elle nécessaire? J'ai dû louper quelque chose...
Avez-vous essayé la méthode DynamicDictionary.GetDynamicMemberNames ()? - http://msdn.Microsoft.com/en-us/library/system.dynamic.dynamicobject.getdynamicmembernames.aspx
Je pense que vous seriez intéressé par la classe ExpandoObject
. La classe DynamicObject
n'est qu'une base où vous êtes censé fournir toute la logique. Il implémente explicitement le IDictionary<string, object>
interface pour que vous puissiez y accéder ou en ajouter de nouvelles de cette façon.
// declare the ExpandoObject
dynamic expObj = new ExpandoObject();
expObj.Name = "MyName";
expObj.Number = 1000;
// print the dynamically added properties
foreach (KeyValuePair<string, object> kvp in expObj) // enumerating over it exposes the Properties and Values as a KeyValuePair
Console.WriteLine("{0} = {1}", kvp.Key, kvp.Value);
// cast to an IDictionary<string, object>
IDictionary<string, object> expDict = expObj;
// add a new property via the dictionary reference
expDict["Foo"] = "Bar";
// verify it's been added on the original dynamic reference
Console.WriteLine(expObj.Foo);
Je venais de réaliser que vous implémentez la classe DynamicDictionary
et vous avez mal compris votre question. Pardon.
Lorsqu'il est utilisé avec une référence dynamique, vous n'avez accès qu'aux membres exposés publiquement. Étant donné que seul Count
est déclaré public (en plus des autres membres DynamicObject
), vous devez utiliser la réflexion pour accéder au dictionnaire interne afin d'obtenir facilement ces valeurs (si vous n'avez pas l'intention pour apporter d'autres modifications).