Следует рассмотреть несколько сценариев. Прежде всего, вам необходимо проверить тип вашего объекта. Для этого вы можете просто вызвать GetType (). Если тип не реализует IDynamicMetaObjectProvider, вы можете использовать отражение так же, как и для любого другого объекта. Что-то вроде:
var propertyInfo = test.GetType().GetProperties();
Однако для реализаций IDynamicMetaObjectProvider простое отражение не работает. По сути, об этом объекте нужно знать больше. Если это ExpandoObject (который является одной из реализаций IDynamicMetaObjectProvider), вы можете использовать ответ, предоставленный itowlson. ExpandoObject сохраняет свои свойства в словаре, и вы можете просто преобразовать свой динамический объект в словарь.
Если это DynamicObject (другая реализация IDynamicMetaObjectProvider), вам необходимо использовать любые методы, которые предоставляет этот DynamicObject. DynamicObject не обязательно где-либо «хранить» свой список свойств. Например, он может сделать что-то вроде этого (я повторно использую пример из своего сообщения в блоге ):
public class SampleObject : DynamicObject
{
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = binder.Name;
return true;
}
}
В этом случае всякий раз, когда вы пытаетесь получить доступ к свойству (с любым заданным именем), объект просто возвращает имя свойства в виде строки.
dynamic obj = new SampleObject();
Console.WriteLine(obj.SampleProperty);
//Prints "SampleProperty".
Итак, вам не о чем размышлять - этот объект не имеет никаких свойств, и в то же время все допустимые имена свойств будут работать.
Я бы сказал, что для реализаций IDynamicMetaObjectProvider вам необходимо отфильтровать известные реализации, в которых вы можете получить список свойств, таких как ExpandoObject, и игнорировать (или генерировать исключение) для остальных.