У меня есть универсальный метод, который берет произвольный JObject (из JSON.net) и преобразует его в типизированный объект.
Итак, давайте упростим мой метод преобразования, чтобы он выглядел следующим образом:
private async Task<T> ConvertToObject(JObject obj) {
//Lots of other stuff yielding in the creation of newObj
var result = newObj.ToObject<T>();
return result;
}
Теперь этот метод работает нормально как есть, но я хочу изменить метод, чтобы я мог правильно делать то же самое для сложных свойств в универсальном объекте, которые недоступны в моем объекте JObject (например, у меня естьчтобы найти их отдельно, выполнить то же преобразование и применить к этому результату объекта).
Пока что мой подход состоит в том, чтобы пройтись по всем свойствам, идентифицировать сложные типы, выполнить поиск, чтобы получить их значения из моегохранилище данных, затем выполните вышеуказанное для них (возможно, рекурсивно, если у них тоже есть какие-либо сложные объекты), затем запишите это значение обратно в это комплексное свойство, повторите для всех остальных и затем, как и прежде, верните этот результат.
Я извлекаю свойства через Reflection:
var properties = result.GetType().GetProperties();
foreach (var property in properties) {
if (IsSimple(property.PropertyType)
continue;
//Do external lookup
var convertedValue = new ConversionTool<>().Lookup(query);
}
Теперь, эта последняя строка, где я чрешая мою проблемуЯ должен передать имя класса в это, а не просто тип, но я знаю только тип во время выполнения для методов отражения выше.Я нашел сообщение в http://www.paulbatum.com/2008/08/less-fragile-way-to-invoke-generic.html, в котором подробно описывается, как сделать эту работу, если я просто передаю универсальный тип в метод, и он объясняет проблему с использованием Activator.CreateInstance в комментариях, но кажется, что я знаю типЯ хотел бы поставить там - я просто не знаю, пока он не запустится (и я получаю его с помощью отражения).
Это похоже на проблему, с которой ORM столкнется, когда дело доходит до заполнения сложных свойствих сущностей, но мне трудно найти, как они это делают.
Учитывая, что вызывающая сторона этого метода знает во время выполнения, каков предполагаемый тип, как я мог бы пройти эту передачувведите в конструктор универсального класса, чтобы я мог вызывать его рекурсивно для каждого сложного члена данного типа?