C# 动态选择字符串列表
本文关键字:列表 字符串 选择 动态 | 更新日期: 2023-09-27 18:26:10
我正在尝试从我的动态对象列表中获取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>
吗?
编辑:
为什么它不起作用?因为你可以把这样的事情搞得一团糟:
public class Test
{
public int ToString()
{
return 0;
}
}
编译器不会知道ToString
返回string
还是int
。
您需要强制转换项目,如下所示:
List<string> things = objects.Select(x => x.nameref.ToString()).Cast<string>().ToList();
它无法识别 ToString()
返回字符串的原因是它是在 dynamic
对象上调用的,并且方法绑定是在运行时完成的,而不是在编译时完成的。
虽然 Rob 的答案很好用,但让我提出一个替代方案:将nameref
转换为正确的类型(如果您碰巧知道nameref
的类型,请将(object)
替换为更具体的强制转换(:
List<string> things = objects.Select(x => ((object)x.nameref).ToString()).ToList();
该解决方案的优点是静态解析ToString
。因此,方法调用是
保证返回
string
,因为编译器知道您正在调用 Object.ToString(((或其覆盖的变体(和更快、更清洁。该解决方案将动态分辨率保持在所需的绝对最小值(即
x.nameref
的分辨率(。编译器会捕获对ToString
调用中的拼写错误。
(当然,如果nameref
的类型恰好是字符串,你可以放弃对ToString()
的调用,使你的代码更干净、更短。
你可以尝试使用 Cast,如下所示:
List<string> things = objects.Select(x => x.nameref).Cast<string>().ToList();
您也可以尝试在Select
本身进行强制转换:
List<string> things = objects.Select(x => x.nameref as string).ToList();
据我了解,转换为所需的List<string>
可以按如下方式完成。
var objects = new List<dynamic>();
// filling objects here
List<string> things = objects.Select(x => x.nameref.ToString()).Cast<string>.ToList();