Есть несколько сценариев для рассмотрения.
Прежде всего, вам необходимо проверить тип вашего объекта. Вы можете просто вызвать 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, и игнорировать (или выбросить исключение) для остальных.