【问题标题】:Argument Type Not assignable using Lambda parameter参数类型不可使用 Lambda 参数分配
【发布时间】:2015-02-04 19:10:51
【问题描述】:

我想提前道歉,因为我没有把点滴滴理解大局。

此方法违反 DRY,并且有一个常用的 3rd 方库,通常可以这样调用:

ThirdLibrary.DoWork(x => x.Blah....);

在尝试重构此方法时,我希望将这一行和它附近的其他一些行提取到一个单独的方法中......但我需要传入 lambda,而谷歌将我引导到 herehere.

我的困难在于将我与第三方库的确切情况转换为。

第三方元数据显示它是预期的:

public IDoWork<T> DoWork(Expression<Action<T>> expression);

我对如何为我的方法进行参数化感到困惑。

public void RepoDoWork(Action<ICustomerRepository> doworkrule)
{
   ThirdLIbrary.DoWork(doworkrule);
}

这会产生错误 Argument type is not assignable to parameter type。

感谢您帮助我了解如何正确传递 lambda。

【问题讨论】:

  • ThirdLibrary.DoWork() 究竟做了什么?
  • 哪一部分违反了DRY? x =&gt; x 部分?我不会担心的。
  • 不确定您在寻找什么 - 方法要求表达并且您尝试通过委托...为什么不能通过 Expression 开始?
  • @DStanley...这是一个片段。为简洁起见,我没有包括所有其他被提取的内容。
  • @AlexeiLevenkov...因为我还没有在 Expression 上学习过...我现在正在谷歌搜索。

标签: c# lambda


【解决方案1】:

方法要求 Expression&lt;...&gt; 并且您尝试传递委托 - 没有有用的转换因此会失败。

要修复,您应该将正确的 Expression 传递给您的助手,并将其传递给第三方方法。

您可以尝试将委托包装到表达式中,但在大多数情况下,它不会在运行时产生有用的结果。通常当方法接受一个表达式时,这意味着它将以某种方式解构表达式并基于它构建逻辑。常见的示例是 LINQ-to-SQL 构建基于 lambda 的 SQL 查询,基于 Queryable.Where(...) 调用或使用表达式设置方法模拟的 Moq 框架。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-24
    • 2021-06-14
    • 1970-01-01
    • 2018-08-10
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    相关资源
    最近更新 更多