C#动态选择字符串列表

时间:2015-12-09 07:36:29

标签: c# .net dynamic

我试图从我的动态对象列表中获取List字符串,并且一直说:

  

错误1无法隐式转换类型   &#39; 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是否返回stringint

4 个答案:

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