Мне нужно прикрепить динамические свойства (количество свойств и их имена неизвестны во время проектирования и компиляции, они известны только во время выполнения через вызов веб-службы) к объекту С#.
В этом случае я пытаюсь использовать 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())? Это то, чего я хочу избежать, потому что это может быть подвержено ошибкам.
Любая помощь высоко ценится.
GetValue()
здесь. Просто получите доступ к члену с помощью оператора.
. Если идентификатором вашего свойства является среда выполненияstring
, рассмотрите возможность использованияDictionary<string, object>
вместоdynamic
. Если вы хотите управлять объектом, например JS, который поддерживает отражение редактирования во время выполнения,Dictionary
больше подходит. - person   schedule 31.07.2020if
, является временем сборки, вы можете сделать логику делегатом и добавить ее вDictionary
. - person   schedule 31.07.2020