【问题标题】:C# Dynamic select List of stringsC# 动态选择字符串列表
【发布时间】:2016-03-14 09:25:39
【问题描述】:

我正在尝试从我的动态对象列表中获取 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

我也尝试从this 答案转换,但它一直给我同样的错误。

有人知道怎么做吗List&lt;string&gt;

编辑:

为什么它不起作用?因为你可以像这样搞砸

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

编译器不知道ToString 是返回string 还是int

【问题讨论】:

    标签: c# .net dynamic


    【解决方案1】:

    你需要像这样投射物品:

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

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

    【讨论】:

      【解决方案2】:

      虽然 Rob 的回答很好,但让我提出一个替代方案:将 nameref 转换为正确的类型(如果您碰巧知道 nameref 的类型,请将 (object) 替换为更具体的类型):

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

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

      • 保证返回string,因为编译器知道您正在调用Object.ToString()(或其覆盖的变体)并且

      • 更快更干净。此解决方案将动态分辨率保持在所需的绝对最小值(即x.nameref 的分辨率)。对ToString 的调用中的拼写错误被编译器捕获。

      (当然,如果nameref的类型恰好是字符串,你可以直接调用ToString(),让你的代码更简洁更短。)

      【讨论】:

        【解决方案3】:

        您可以尝试使用 Cast,如下所示:

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

        您也可以尝试在 Select 本身中进行转换:

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

        【讨论】:

          【解决方案4】:

          据我了解,转换为所需的List&lt;string&gt; 可以如下完成。

          var objects = new List<dynamic>();
          
          // filling objects here
          
          List<string> things = objects.Select(x => x.nameref.ToString()).Cast<string>.ToList();
          

          【讨论】:

            猜你喜欢
            • 2014-11-09
            • 2023-04-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多