С# Динамический выбор Список строк
Я пытаюсь получить List
строк из списка динамических объектов, и он продолжает говорить, что:
Ошибка 1 Невозможно неявно преобразовать тип 'System.Collections.Generic.List<dynamic>
' до System.Collections.Generic.List<string>
Я выбираю свойство и использую .ToString()
на нем:
var objects = new List<dynamic>();
//filling objects here
List<string> things = objects.Select(x => x.nameref.ToString()).ToList();
Значит, это не допустимый список строк? Почему компилятор предполагает, что этот список имеет тип dynamic
?
Я также попытался преобразовать из этого ответа, но он продолжает давать мне ту же ошибку.
Кто-нибудь знает, как сделать это List<string>
?
EDIT:
Почему он не работает? Потому что вы можете сделать mess следующим образом:
public class Test
{
public int ToString()
{
return 0;
}
}
и компилятор не знает, возвращает ли ToString
string
или int
.
Ответы
Ответ 1
Хотя ответ Роба работает нормально, позвольте мне предложить альтернативу: nameref
к правильному типу (замените (object)
более конкретным приведением, если вы случайно знаете тип nameref
):
List<string> things = objects.Select(x => ((object)x.nameref).ToString()).ToList();
Преимущество этого решения в том, что ToString
статически разрешается. Таким образом, вызов метода
-
гарантированно возвращает string
, так как компилятор знает, что вы вызываете Object.ToString() (или его переопределенный вариант) и
-
быстрее и чище. Это решение поддерживает динамическое разрешение до необходимого абсолютного минимума (т. x.nameref
Разрешение x.nameref
). Опечатки в вызове ToString
перехватываются компилятором.
(Конечно, если nameref
является строковым, вы можете просто отбросить вызов ToString()
, что сделает ваш код еще чище и короче.)
Ответ 2
Вам нужно бросить предметы, например:
List<string> things = objects.Select(x => x.nameref.ToString()).Cast<string>().ToList();
Причина, почему он не распознает, что ToString()
возвращает строку, - это то, что она вызвала объект dynamic
, а привязка метода выполняется во время выполнения, а не время компиляции.
Ответ 3
Вы можете попробовать использовать Cast, например:
List<string> things = objects.Select(x => x.nameref).Cast<string>().ToList();
Вы также можете попробовать выполнить кастинг в самой Select
:
List<string> things = objects.Select(x => x.nameref as string).ToList();
Ответ 4
Насколько я понимаю, преобразование в желаемый List<string>
можно сделать следующим образом.
var objects = new List<dynamic>();
// filling objects here
List<string> things = objects.Select(x => x.nameref.ToString()).Cast<string>.ToList();