2015-12-09 59 views
16

我试图让琴弦的List从我的动态对象名单,并口口声声说:C#动态选择字符串列表

错误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

我试过也从this转换答案,但它不断给我同样的错误。

任何人都知道如何使它List<string>

编辑:

为什么它不工作?因为你可以使这样的:

public class Test 
{ 
    public int ToString() 
    { 
     return 0; 
    } 
} 

和编译器将不知道是否ToString回报stringint

回答

18

你需要投的项目,像这样:

List<string> things = objects.Select(x => x.nameref.ToString()).Cast<string>().ToList(); 

它不认识到ToString()返回字符串的原因是它在dynamic对象,并且方法绑定在运行时完成,而不是编译时。

+3

大,为解释谢谢:) – wudzik

+1

@wudzik高兴地帮助,队友:) – Rob

+1

我编辑了我的问题,添加示例为什么它不工作灵感来自您的答案:) – wudzik

5

你可以尝试使用演员,像这样:

List<string> things = objects.Select(x => x.nameref).Cast<string>().ToList(); 

您也可以尝试在Select铸件本身:

List<string> things = objects.Select(x => x.nameref as string).ToList(); 
2

就我的理解,转换到所需的List<string>可以按如下方式完成。

var objects = new List<dynamic>(); 

// filling objects here 

List<string> things = objects.Select(x => x.nameref.ToString()).Cast<string>.ToList(); 
7

虽然接受的答案工作正常,让我提出一个替代方案:铸造nameref为正确的类型(通过更具体的投更换(object),如果你碰巧知道nameref类型):

List<string> things = objects.Select(x => ((object)x.nameref).ToString()).ToList(); 

该解决方案的优点是ToString是静态解决的。因此,该方法调用

  • 保证返回string,因为编译器知道你在呼唤Object.ToString()(或其重写变体)和

  • 更快和更清洁。该解决方案可将动态分辨率保持为所需的绝对最小值(即分辨率为x.nameref)。致电ToString的错字被编译器捕获。

(当然,如果nameref类型恰好是字符串,你能把调用ToString(),使你的代码更清洁和更短。)

+0

很好的答案,谢谢!我会尝试这种方法。 – wudzik