我试图将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),参数);
答案 0 :(得分:0)
当您编写与每个表达式类似的实际代码时,很容易看到正在发生的事情。
第一个:
Action<string[]> firstDelegate = parameterName => Console.ReadLine();
对于第二个:
Action<string[]> firstDelegate = parameterName => parameterName => Console.Readline();
因此,当您调用第一个委托时,它会从控制台读取一行。当你调用第二个委托时,它会创建一个新的lambda,然后不对它做任何事情。
如果您想创建一个从控制台读取一行的委托,那么您的第一个代码段就是您应该如何操作的。在这种情况下,没有理由在lambda内部创建lambda。