【问题标题】:Cannot use a lambda expression as an argument to a dynamically dispatched operation when operated with DataTable使用 DataTable 操作时,不能将 lambda 表达式用作动态分派操作的参数
【发布时间】:2017-09-18 05:24:02
【问题描述】:

我正在尝试将列的数据从 DataTable 提取到 List<string>。示例代码如下:

List<String> userNames = dataTable.Rows.OfType<DataRow>().
                                Select(dr => dr.Field<string>("UserName"))
                                .ToList();

我收到来自 Visual Studio 2015 的错误消息:

不能使用 lambda 表达式作为动态参数 在没有先将其强制转换给委托人的情况下分派操作或 表达式树类型。

DataTable 有 3 行,所有数据的类型都是string

Google 搜索了几个小时,仍然无法解决。我该如何解决这个错误?

更新:@IvanStoev 注意到我 dataTable 是一个 dynamic 变量,而不是 DataTable

【问题讨论】:

  • 你确定这条线会产生错误吗?请提供Minimal, Complete, and Verifiable example
  • 我可以复制编译错误的唯一方法是dataTable 变量的类型为dynamic。是这样吗?为什么不是DataTable
  • @OfirWinegarte 是的。我正在尝试通过 NPOI 库读取 excel 文件。
  • @IvanStoev 是的,它是dynamic,而不是DataTable,我刚刚检查了代码并更新了问题,抱歉我的错误。
  • 然后改成DataTable或者使用cast - ((DataTable)dataTable).Rows....

标签: c# lambda


【解决方案1】:

您的代码看起来不错,但您也可以尝试以下操作:

var userNames = (from x in dataTable.AsEnumerable()
                select x.Field<string>("UserName")).ToList();

希望这会有所帮助!

【讨论】:

  • 已经尝试过了,它确实有效。虽然问题是 dataTable 是一个 dynamic 变量,但还是谢谢你。
  • 很高兴为您提供帮助,想知道您是否投赞成票 :) 编程愉快
【解决方案2】:

你必须在 DataTable 上使用 AsEnumerable(),然后你将对 DataRows 进行操作。你可以试试这个:

List<String> userNames = dt.AsEnumerable().Select(dr => dr.Field<string>("UserName")).ToList();

【讨论】:

  • 这行得通。虽然问题是 dataTable 是一个 dynamic 变量,但还是谢谢你。
【解决方案3】:

虽然前面已经回答了,但我认为值得一提的是 dynamic 类型在运行时评估,当我们尝试使用 . 访问属性时,很明显会出现此编译时错误。 例如。

dynamic temp = new MyClass();
temp.prop1  // compile time error.

您必须将其转换回特定类型,如下所示:

((MyClass)temp).prop1  //   works.

在您的情况下,尝试将 dataTable 转换为 DataTable

((DataTable)dataTable).Rows.... 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多