我试图从我的动态对象列表中获取List
字符串,并且一直说:
错误1无法隐式转换类型 '
System.Collections.Generic.List<dynamic>
&#39;至 &#39;System.Collections.Generic.List<string>
&#39;
我选择了一个属性并在其上使用.ToString()
:
var objects = new List<dynamic>();
//filling objects here
List<string> things = objects.Select(x => x.nameref.ToString()).ToList();
所以它不是一个有效的字符串列表吗?为什么编译器假设此列表的类型为dynamic
?
我也试过转换this回答,但它一直给我同样的错误。
任何人都知道如何制作List<string>
?
编辑:
为什么它不起作用?因为你可以像这样做混乱:
public class Test
{
public int ToString()
{
return 0;
}
}
并且编译器不知道ToString
是否返回string
或int
。
答案 0 :(得分:19)
您需要投射项目,如下所示:
List<string> things = objects.Select(x => x.nameref.ToString()).Cast<string>().ToList();
它不能识别ToString()
返回字符串的原因是它在dynamic
对象上调用,而方法绑定在运行时完成,而不是编译时间。
答案 1 :(得分:7)
虽然接受的答案可以正常使用,但我建议一个替代方案:将nameref
投射到正确的类型(如果您恰好知道{{1的类型,则更换(object)
更具体的投射}}):
nameref
该解决方案的优点是List<string> things = objects.Select(x => ((object)x.nameref).ToString()).ToList();
是静态解析的。因此,方法调用是
保证返回ToString
,因为编译器知道您正在调用Object.ToString()(或其被覆盖的变体)和
更快更清洁。该解决方案将动态分辨率保持在所需的绝对最小值(即string
的分辨率)。调用x.nameref
时的错别字被编译器捕获。
(当然,如果ToString
的类型恰好是字符串,您可以将调用放到nameref
,使您的代码更清晰,更短。)
答案 2 :(得分:5)
您可以尝试使用Cast,如下所示:
List<string> things = objects.Select(x => x.nameref).Cast<string>().ToList();
你也可以尝试在Select
本身进行投射:
List<string> things = objects.Select(x => x.nameref as string).ToList();
答案 3 :(得分:2)
据我了解,转换为所需的List<string>
可以按如下方式进行。
var objects = new List<dynamic>();
// filling objects here
List<string> things = objects.Select(x => x.nameref.ToString()).Cast<string>.ToList();