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:
var propertyInfo = test.GetType().GetProperties();
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 ):
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 un nom donné), l'objet renvoie simplement le nom de la propriété sous forme de chaîne.
dynamic obj = new SampleObject();
Console.WriteLine(obj.SampleProperty);
//Prints "SampleProperty".
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.