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

C# 动态选择字符串列表

您需要强制转换项目,如下所示:

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();