表达式应该是MethodCallExpression,调用Expression<Action>时出现错误

3
以下代码抛出“表达式必须是MethodCallExpression”的异常,原因是什么?我认为调用一个Action就是这样做了。
     Action startBouncePolling = new Action(async () =>
    {

    });

    BackgroundJob.Enqueue(() => startBouncePolling());

Enqueue的签名是Expression<Action>的一个参数

1个回答

8
当你调用 startBouncePolling() 时,你并不是在调用一个方法。实际上,startBouncePolling 并不是一个方法,它是一个委托。因此,你实际上是在“调用委托”。
因此,lambda 表达式的主体 () => startBouncePolling() 最终成为一个 InvocationExpression,而不是一个 MethodCallExpression
如果你使用一个方法而不是一个委托,例如:
public async Task StartBouncePolling()
{
}
...
BackgroundJob.Enqueue(() => StartBouncePolling());

那么这个主体就会是一个MethodCallExpression


1
抱歉,我的意思是如果可能的话,我想问如何强制执行这个操作,因为有一些其他限制阻止我将其创建为一个方法。我不知道原因是否重要,但为了明确起见,原因是:Enqueue返回一个作业ID,我需要在StartBouncePolling()内部使用该作业ID来取消作业。然而,如果我不使用ref修饰符传递jobid,我认为它不会从Enqueue()的返回值中更新,因为字符串引用将被传递为值。异步方法不能有ref修饰符。我的方法必须是异步的。 - parliament
4
你需要一种方法来创建一个MethodCallExpression。我不知道它是否适用于你的使用情况,但你可以使用startBouncePolling.Invoke()代替startBouncePolling()。然后它应该是委托类型的方法调用。但这可能会在其他方面出现问题。 - Eren Ersönmez
不需要创建单独的方法,我可以内联声明 string jobid 并在操作中使用它,而无需作为 ref 传递。 - parliament

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接