J’ai besoin d’obtenir un dictionnaire de propriétés et leurs valeurs à partir d’un objet déclaré avec le mot clé dynamic en .NET 4 ? Il semble à l’aide de réflexion, car cela ne fonctionnera pas.
Exemple :
J’ai besoin d’obtenir un dictionnaire de propriétés et leurs valeurs à partir d’un objet déclaré avec le mot clé dynamic en .NET 4 ? Il semble à l’aide de réflexion, car cela ne fonctionnera pas.
Exemple :
Dans le cas de ExpandoObject, la classe ExpandoObject implémente en fait `` pour ses propriétés, donc la solution est aussi banale comme coulée :
Notez que cela ne fonctionnera pas pour les objets dynamiques générales. Dans ces cas, vous devrez descendre jusqu'à la DLR via IDynamicMetaObjectProvider.
Il y a plusieurs scénarios à prendre en considération. Tout d'abord, vous devez vérifier le type de votre objet. Vous pouvez simplement appeler GetType() pour cela. Si le type ne met pas en œuvre idynamicmetaobjectprovider fournie par, alors vous pouvez utiliser la réflexion même que pour tout autre objet. Quelque chose comme:
var propertyInfo = test.GetType().GetProperties();
Cependant, pour idynamicmetaobjectprovider fournie par les implémentations, la simple réflexion ne fonctionne pas. Fondamentalement, vous avez besoin d'en savoir plus à propos de cet objet. Si c'est ExpandoObject (qui est l'un des idynamicmetaobjectprovider fournie par les implémentations de), vous pouvez utiliser la réponse fournie par itowlson. ExpandoObject stocke ses propriétés dans un dictionnaire et vous pouvez tout simplement jeté votre objet dynamique à un dictionnaire.
Si c'est DynamicObject (un autre idynamicmetaobjectprovider fournie par la mise en œuvre), alors vous devez utiliser toutes les méthodes de cette DynamicObject expose. DynamicObject n'est pas requis pour la "boutique" de sa liste de propriétés de n'importe où. Par exemple, il pourrait faire quelque chose comme ça (je suis en réutilisant un exemple de partir de mon blog):
public class SampleObject : DynamicObject
{
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = binder.Name;
return true;
}
}
Dans ce cas, chaque fois que vous essayez d'accéder à une propriété (avec n'importe quel nom), l'objet retourne simplement le nom de la propriété en tant que chaîne.
dynamic obj = new SampleObject();
Console.WriteLine(obj.SampleProperty);
//Prints "SampleProperty".
Donc, vous n'avez pas de quoi réfléchir sur la - cet objet n'a pas toutes les propriétés, et dans le même temps, toutes les les noms de propriété fonctionne.
Je dirais que pour idynamicmetaobjectprovider fournie par les implémentations, vous avez besoin de filtrer sur les implémentations où vous pouvez obtenir une liste de propriétés, telles que ExpandoObject, et ignorer (ou lever une exception) pour le reste.
Si le idynamicmetaobjectprovider fournie par peut fournir la dynamique des noms de membre, vous pouvez les obtenir. Voir GetMemberNames mise en œuvre dans les sous licence apache PCL bibliothèque Dynamitey (qui peut être trouvé dans nuget), il travaille pour ExpandoObject
s et DynamicObject
s qui implémentent GetDynamicMemberNames
et tous les autres IDynamicMetaObjectProvider
qui fournit un méta-objet avec une mise en œuvre de l' GetDynamicMemberNames
sans personnalisé de test au-delà de is IDynamicMetaObjectProvider
.
Après avoir obtenu les noms des membres c'est un peu plus de travail pour obtenir la valeur de la bonne façon, mais Impromptu fait cela, mais il est plus difficile de définir les bits intéressants et avoir de sens. Voici la documentation et il est égal ou plus rapide que la réflexion, cependant, peu de chances d'être plus rapide qu'une recherche dans le dictionnaire pour expando, mais cela fonctionne pour n'importe quel objet, expando, dynamique et original.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.