我试图将 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 创建一个程序集和一个由 expr1 填充的 MethodBuilder 来编译的。CompileToMethod(methodBuilder(;
嵌套的 lambda 不起作用还是我必须以不同的方式使用它?
编辑:正如@Servy指出的那样,Expression.Lambda只会创建但不执行lambda。
lambda 可以通过以下答案在表达式中执行:如何在 C#/.NET 中使用 LINQ 表达式树调用 lambda
Expression.Invoke(Expression.Constant(innerLambda(, parameter(;
当您编写类似于每个表达式的实际代码时,很容易看到发生了什么。
对于第一个:
Action<string[]> firstDelegate = parameterName => Console.ReadLine();
对于第二个:
Action<string[]> firstDelegate = parameterName => parameterName => Console.Readline();
因此,当您调用第一个委托时,它会从控制台读取一行。 当您调用第二个委托时,它会创建一个新的 lambda,然后不对其执行任何操作。
如果要创建从控制台读取行的委托,则第一个代码段正是您应该如何操作的。 在这种情况下,没有理由在 lambda 中创建 lambda。