Если IDynamicMetaObjectProvider может предоставить имена динамических членов, вы можете их получить. См. Реализацию GetMemberNames в лицензированной Apache библиотеке PCL Dynamitey (которую можно найти в nuget), она работает для ExpandoObject
s и DynamicObject
s, которые реализуются, GetDynamicMemberNames
и для любых других, IDynamicMetaObjectProvider
которые предоставляют мета-объект с реализацией GetDynamicMemberNames
без дополнительного тестирования is IDynamicMetaObjectProvider
.
После получения имен участников требуется немного больше работы, чтобы получить правильное значение, но Impromptu делает это, но труднее указать только на интересные части и понять их. Вот документация, и она равна или быстрее, чем отражение, однако вряд ли будет быстрее, чем поиск в словаре для expando, но она работает для любого объекта, расширенного, динамического или оригинального - вы называете это.
В случае ExpandoObject класс ExpandoObject фактически реализует
IDictionary<string, object>
свои свойства, поэтому решение столь же тривиально, как приведение типов:Обратите внимание, что это не будет работать для обычных динамических объектов. В этих случаях вам нужно будет перейти к DLR через IDynamicMetaObjectProvider.
источник
Следует рассмотреть несколько сценариев. Прежде всего, вам необходимо проверить тип вашего объекта. Для этого вы можете просто вызвать GetType (). Если тип не реализует IDynamicMetaObjectProvider, вы можете использовать отражение так же, как и для любого другого объекта. Что-то вроде:
Однако для реализаций IDynamicMetaObjectProvider простое отражение не работает. По сути, об этом объекте нужно знать больше. Если это ExpandoObject (который является одной из реализаций IDynamicMetaObjectProvider), вы можете использовать ответ, предоставленный itowlson. ExpandoObject сохраняет свои свойства в словаре, и вы можете просто преобразовать свой динамический объект в словарь.
Если это DynamicObject (другая реализация IDynamicMetaObjectProvider), вам необходимо использовать любые методы, которые предоставляет этот DynamicObject. DynamicObject не обязательно где-либо «хранить» свой список свойств. Например, он может сделать что-то вроде этого (я повторно использую пример из своего сообщения в блоге ):
В этом случае всякий раз, когда вы пытаетесь получить доступ к свойству (с любым заданным именем), объект просто возвращает имя свойства в виде строки.
Итак, вам не о чем размышлять - этот объект не имеет никаких свойств, и в то же время все допустимые имена свойств будут работать.
Я бы сказал, что для реализаций IDynamicMetaObjectProvider вам необходимо отфильтровать известные реализации, в которых вы можете получить список свойств, таких как ExpandoObject, и игнорировать (или генерировать исключение) для остальных.
источник
Требуется Newtonsoft Json.Net
Немного поздно, но это я придумал. Он дает вам только ключи, а затем вы можете использовать их в динамике:
Затем вы просто выполняете foreach вот так:
Выбор получения значения в виде строки или какого-либо другого объекта или выполнение другой динамической операции и повторное использование поиска.
источник
JObject attributesAsJObject = dynamicToGetPropertiesFor;
что - то вроде:var jObject = (JObject) JToken.FromObject(dynamicToGetPropertiesFor);
. На этом этапе вы можете получить словарь имен и значений свойств, выполнив что-то вродеvar objProperties = jObject.ToObject<Dictionary<string, object>>();
. Имея это в руках, вы отправляетесь в гонки. Это не требует динамики. Он отлично работает со всем, что является подклассомDynamicObject