С# Динамический выбор Список строк

Я пытаюсь получить 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();