C# 动态 select 字符串列表
C# Dynamic select List of strings
我试图从我的动态对象列表中获取 List
个字符串,但它一直说:
Error 1 Cannot implicitly convert type
'System.Collections.Generic.List<dynamic>
' to
'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
?
我也尝试过从 this 答案转换,但它总是给我同样的错误。
有人知道怎么做吗List<string>
?
编辑:
为什么它不起作用?因为你可以像这样乱:
public class Test
{
public int ToString()
{
return 0;
}
}
并且编译器不知道 ToString
returns string
或 int
.
您可以尝试使用 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> things = objects.Select(x => x.nameref.ToString()).Cast<string>().ToList();
它不能识别 ToString()
returns 字符串的原因是它是在 dynamic
对象上调用的,并且方法绑定是在运行时完成的,而不是编译时。
据我了解,可以按如下方式转换为所需的 List<string>
。
var objects = new List<dynamic>();
// filling objects here
List<string> things = objects.Select(x => x.nameref.ToString()).Cast<string>.ToList();
虽然 Rob 的回答很好,但让我提出一个替代方案:将 nameref
转换为正确的类型(如果您碰巧知道 [= 的类型,请将 (object)
替换为更具体的类型11=]):
List<string> things = objects.Select(x => ((object)x.nameref).ToString()).ToList();
该解决方案的优点是 ToString
是静态解析的。因此,方法调用是
保证 return string
,因为编译器知道您正在调用 Object.ToString()(或其覆盖变体)和
更快更干净。该解决方案将动态分辨率保持在所需的绝对最小值(即 x.nameref
的分辨率)。 ToString
调用中的拼写错误被编译器捕获。
(当然,如果nameref
的类型恰好是字符串,你可以直接放弃对ToString()
的调用,让你的代码更简洁。)
我试图从我的动态对象列表中获取 List
个字符串,但它一直说:
Error 1 Cannot implicitly convert type '
System.Collections.Generic.List<dynamic>
' to '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
?
我也尝试过从 this 答案转换,但它总是给我同样的错误。
有人知道怎么做吗List<string>
?
编辑:
为什么它不起作用?因为你可以像这样乱:
public class Test
{
public int ToString()
{
return 0;
}
}
并且编译器不知道 ToString
returns string
或 int
.
您可以尝试使用 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> things = objects.Select(x => x.nameref.ToString()).Cast<string>().ToList();
它不能识别 ToString()
returns 字符串的原因是它是在 dynamic
对象上调用的,并且方法绑定是在运行时完成的,而不是编译时。
据我了解,可以按如下方式转换为所需的 List<string>
。
var objects = new List<dynamic>();
// filling objects here
List<string> things = objects.Select(x => x.nameref.ToString()).Cast<string>.ToList();
虽然 Rob 的回答很好,但让我提出一个替代方案:将 nameref
转换为正确的类型(如果您碰巧知道 [= 的类型,请将 (object)
替换为更具体的类型11=]):
List<string> things = objects.Select(x => ((object)x.nameref).ToString()).ToList();
该解决方案的优点是 ToString
是静态解析的。因此,方法调用是
保证 return
string
,因为编译器知道您正在调用 Object.ToString()(或其覆盖变体)和更快更干净。该解决方案将动态分辨率保持在所需的绝对最小值(即
x.nameref
的分辨率)。ToString
调用中的拼写错误被编译器捕获。
(当然,如果nameref
的类型恰好是字符串,你可以直接放弃对ToString()
的调用,让你的代码更简洁。)