2015-03-21 3 views
1

Я делаю некоторую работу с отражением. Мой API получает некоторый JSON, и я хотел бы преобразовать его в список типа, который он есть.Преобразование из общего списка в определенный список с использованием отражения

В

общественного переназначения BOOL TrySetMember (SetMemberBinder вяжущее, значение объекта)

У меня есть кэшированный список свойств, и один из них является списком. Я знаю, что это правда, потому что я могу видеть из prop.PropertyType.

Я хотел был бы преобразовать это свойство в фактический список, типа Foo, но я не могу этого сделать. Лучшее, что я мог получить, это Список. value - это json-массив Foo (поэтому кто-то отправил мне JSON в массив [] как Foo).

//this works, and listOfObjects is of type List<Foo> when I go deep into the quick watch of it, but it's still a list<Object> in the end. 
var listOfObjects = JsonConvert.DeserializeObject<List<Object>>(value.ToString()); 

Я могу прямо бросить СПИСОК_ОБЪЕКТЫ как список, и это работает, но проблема Foo может быть любым типом, например бар также возможен. Так что есть бесконечные возможные типы, вот что я говорю. Есть ли способ, которым я могу как-то сказать, что это Foo, когда я делаю актеры? Я могу получить тип «Foo» из моей информации о свойствах? Я всегда могу найти тип, который я хочу преобразовать, используя информацию о свойствах, но что тогда? Я не могу сделать трансляцию с переменной справа?

Спасибо!

+0

У вас есть контроль над кодировкой и расшифровкой json? Если это так, вы можете использовать библиотеку Json, которая поддерживает подсказки типа. Затем, когда вы Deserialize, вы получаете, какой бы тип объекта не был сериализован в первую очередь. – yoyo

ответ

0

Так вот как вы это делаете:

Использование функции DeserializeObject:

JsonConvert.DeserializeObject(jsonstring, prop.PropertyType.GenericTypeArguments[0]); 

теперь я в состоянии сказать «для данной строки JSON, брось к этому типу на основе любой это тип свойства в настоящее время ". Таким образом, я могу создать экземпляр того, что я хочу, а затем добавить его. Оно работает!

1

Я не могу сделать трансляцию с переменной справа?

Даже если бы вы могли, что бы вы ввели эту переменную как? Вы можете работать только с наименьшими общими знаменателями в статических типизированных языках, и все, что вы знаете во время компиляции, это то, что у вас есть список объектов.

Как только вы выясните тип, вы можете использовать Enumerable.Cast<T>(), чтобы направить его на правильный тип, но для этого вам все еще нужен статический тип.

В качестве альтернативы просто скажите, что вы не можете понять это на основе требований, которые у вас есть, и просто использовать dynamic. Это своего рода цель (помимо COM-взаимодействия), работать с неизвестными типами просто утиным набором.

+0

У Фиоры есть точка. Я также добавляю, что если вам нужно использовать 'dynamic', вам может потребоваться пересмотреть дизайн. Избегайте любой ценой! – SimpleVar

+0

Хм, хорошо видно, мне не нужно вводить его во время компиляции, мне просто нужно во время выполнения преобразовать список в список , поскольку информация о недвижимости говорит, что у меня есть. Посмотрите, когда я быстро просмотрю переменную, все будет выглядеть как List для базового типа. Я просто хочу добавить это значение (в качестве списка не перечислить в другую коллекцию в другом месте). Это возможно? – NullHypothesis

+0

'Enumerable.Cast ()', как указано в приведенном выше ответе.Но вы подразумевали, что 'Foo' может быть' Bar' тоже или что-то еще, и в этом случае вам нужно прочитать остальную часть ответа. – Blindy