Как имитировать GetType().GetProperties() и PropertyInfo.GetValue() для ExpandoObject в C#

Мне нужно прикрепить динамические свойства (количество свойств и их имена неизвестны во время проектирования и компиляции, они известны только во время выполнения через вызов веб-службы) к объекту С#.

В этом случае я пытаюсь использовать ExpandoObject и преобразовать его в IDictory‹string, object›, чтобы добавить динамическое свойство.

IDictionary<string, object> expObj = new ExpandoObject() as IDictionary<string, object>;
// items are returned by external API with dynamic number of elements with dynamic name
foreach (Item item in items)
{
    expObj.Add(item.Name, item.Value);
}

Приведенный выше код может успешно добавить динамические свойства в expObj.

Затем мне нужно вызвать некоторые вспомогательные функции, которые вызовут GetType().GetProperties(), а затем пройдутся по всем возвращаемым свойствам, чтобы получить значение (с помощью PropertyInfo.GetValue()), чтобы выполнить некоторую логику обработки.

Однако, согласно объекту ExpandoObject и GetProperty()

Поскольку ExpandoObject является привязкой во время выполнения и не переходит на уровень CLR, отражение в этом случае не работает.

Есть ли способ заставить GetType().GetProperties() и PropertyInfo.GetValue() работать или имитировать поведение в ExpandoObject?

Или мой единственный способ сделать некоторый рефакторинг класса Helper (добавить несколько операторов if-then-else. Я имею в виду {if}, это ExpandoObject, привести его к IDictionary и циклически {else} вызвать GetType().GetProperties () и PropertyInfo.GetValue())? Это то, чего я хочу избежать, потому что это может быть подвержено ошибкам.

Любая помощь высоко ценится.


person kzfid    schedule 31.07.2020    source источник
comment
Вам действительно не нужно GetValue() здесь. Просто получите доступ к члену с помощью оператора .. Если идентификатором вашего свойства является среда выполнения string, рассмотрите возможность использования Dictionary<string, object> вместо dynamic. Если вы хотите управлять объектом, например JS, который поддерживает отражение редактирования во время выполнения, Dictionary больше подходит.   -  person    schedule 31.07.2020
comment
Действительно, вы правы, мне не нужен GetValue, если он есть только в моей функции. Проблема в том, что мне нужно вызывать другие функции, которые используют отражение в своей логике. Если я использую словарь, если все еще нужно добавить операторы if-then-else в эти функции для его обработки   -  person kzfid    schedule 31.07.2020
comment
Если ваша логика, такая как if, является временем сборки, вы можете сделать логику делегатом и добавить ее в Dictionary.   -  person    schedule 31.07.2020