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 stringint.

您可以尝试使用 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()的调用,让你的代码更简洁。)