Si IDynamicMetaObjectProvider peut fournir les noms de membres dynamiques, vous pouvez les obtenir. Voir l' implémentation de GetMemberNames dans la bibliothèque PCL sous licence Apache Dynamitey (qui peut être trouvée dans nuget), cela fonctionne pour les ExpandoObject
s et DynamicObject
s qui implémentent GetDynamicMemberNames
et tout autre IDynamicMetaObjectProvider
qui fournit un méta-objet avec une implémentation GetDynamicMemberNames
sans test personnalisé au-delà is IDynamicMetaObjectProvider
.
Après avoir obtenu les noms des membres, il faut un peu plus de travail pour obtenir la valeur de la bonne manière, mais Impromptu le fait, mais il est plus difficile de pointer uniquement les éléments intéressants et de donner un sens. Voici la documentation et elle est égale ou plus rapide que la réflexion, cependant, il est peu probable qu'elle soit plus rapide qu'une recherche dans le dictionnaire pour expando, mais cela fonctionne pour n'importe quel objet, expando, dynamique ou original - vous l'appelez.
Dans le cas de ExpandoObject, la classe ExpandoObject implémente en fait
IDictionary<string, object>
pour ses propriétés, donc la solution est aussi simple que la conversion :Notez que cela ne fonctionnera pas pour les objets dynamiques généraux. Dans ces cas, vous devrez accéder au DLR via IDynamicMetaObjectProvider.
la source
Il existe plusieurs scénarios à considérer. Tout d'abord, vous devez vérifier le type de votre objet. Vous pouvez simplement appeler GetType () pour cela. Si le type n'implémente pas IDynamicMetaObjectProvider, vous pouvez utiliser la réflexion comme pour tout autre objet. Quelque chose comme:
Cependant, pour les implémentations IDynamicMetaObjectProvider, la réflexion simple ne fonctionne pas. En gros, vous devez en savoir plus sur cet objet. S'il s'agit de ExpandoObject (qui est l'une des implémentations IDynamicMetaObjectProvider), vous pouvez utiliser la réponse fournie par itowlson. ExpandoObject stocke ses propriétés dans un dictionnaire et vous pouvez simplement convertir votre objet dynamique dans un dictionnaire.
S'il s'agit de DynamicObject (une autre implémentation de IDynamicMetaObjectProvider), vous devez utiliser les méthodes que ce DynamicObject expose. DynamicObject n'est pas obligé de "stocker" sa liste de propriétés n'importe où. Par exemple, cela pourrait faire quelque chose comme ceci (je réutilise un exemple de mon article de blog ):
Dans ce cas, chaque fois que vous essayez d'accéder à une propriété (avec un nom donné), l'objet renvoie simplement le nom de la propriété sous forme de chaîne.
Donc, vous n'avez rien à réfléchir - cet objet n'a aucune propriété, et en même temps tous les noms de propriété valides fonctionneront.
Je dirais que pour les implémentations IDynamicMetaObjectProvider, vous devez filtrer sur les implémentations connues où vous pouvez obtenir une liste de propriétés, telles que ExpandoObject, et ignorer (ou lever une exception) pour le reste.
la source
Nécessite Newtonsoft Json.Net
Un peu tard, mais j'ai trouvé ça. Il ne vous donne que les clés et vous pouvez ensuite les utiliser sur la dynamique:
Ensuite, vous foreach simplement comme ceci:
Choisir d'obtenir la valeur sous forme de chaîne ou d'un autre objet, ou de faire une autre dynamique et d'utiliser à nouveau la recherche.
la source
JObject attributesAsJObject = dynamicToGetPropertiesFor;
par quelque chose comme:var jObject = (JObject) JToken.FromObject(dynamicToGetPropertiesFor);
. À ce stade, vous pouvez obtenir un dictionnaire des noms de propriétés et des valeurs en faisant quelque chose commevar objProperties = jObject.ToObject<Dictionary<string, object>>();
. Avec cela en main, vous partez pour les courses. Cela n'a pas besoin d'une dynamique. Cela fonctionne bien avec tout ce qui est une sous-classe deDynamicObject