C#编译表达式作为ConsoleApplication ReadLine不暂停

时间:2018-01-05 18:57:02

标签: c# linq lambda

我试图将linq表达式编译为控制台应用程序为.exe文件。

以下代码正常工作并暂停:

LambdaExpression expr1 = Expression.Lambda<Action<string[]>>(
Expression.Call(typeof(Console).GetMethod("ReadLine")),
Expression.Parameter(typeof(string[])));

然而,当在另一个lambda中进行lambda调用时,这样:

var parameter = Expression.Parameter(typeof(string[]));
LambdaExpression expr1 = Expression.Lambda<Action<string[]>>(
    Expression.Lambda<Action<string[]>>(
        Expression.Call(typeof(Console).GetMethod("ReadLine")),
        parameter), parameter);

它只是关闭控制台而不会暂停。

表达式是通过AssemblyBuilder创建一个Assembly和一个由expr1.CompileToMethod(methodBuilder)填充的MethodBuilder编译的;

嵌套的lambda不起作用还是我必须以不同的方式使用它?

编辑:正如@Servy所指出的,Expression.Lambda只会创建但不会执行lambda。

可以使用以下答案执行lambda:How to call a lambda using LINQ expression trees in C# / .NET

  

Expression.Invoke(Expression.Constant(innerLambda),参数);

1 个答案:

答案 0 :(得分:0)

当您编写与每个表达式类似的实际代码时,很容易看到正在发生的事情。

第一个:

Action<string[]> firstDelegate = parameterName => Console.ReadLine();

对于第二个:

Action<string[]> firstDelegate = parameterName => parameterName => Console.Readline();

因此,当您调用第一个委托时,它会从控制台读取一行。当你调用第二个委托时,它会创建一个新的lambda,然后不对它做任何事情。

如果您想创建一个从控制台读取一行的委托,那么您的第一个代码段就是您应该如何操作的。在这种情况下,没有理由在lambda内部创建lambda。