【发布时间】:2018-01-05 18:57:02
【问题描述】:
我正在尝试将 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 来编译表达式;
嵌套的 lambdas 不起作用还是我必须以不同的方式使用它?
编辑:正如@Servy 指出的那样,Expression.Lambda 只会创建但不会执行 lambda。
可以使用以下答案在表达式中执行 lambda:How to call a lambda using LINQ expression trees in C# / .NET
Expression.Invoke(Expression.Constant(innerLambda), 参数);
【问题讨论】:
-
调试时需要在任何控制台应用程序的末尾放置一个 Console.ReadKey() 或类似命令。否则它会在您有时间阅读输出之前关闭,这可能会给您提示。这个问题很常见,编译器通常会添加这样一行来自动调试构建。但并非总是如此。
-
@Christopher 是的,问题的关键在于创建一个表达式来精确地做到这一点。
-
忘记在表达式中这样做。在实际的控制台程序代码中执行此操作。这就是它一直属于的地方。
-
@Christopher 你有没有考虑过-。这是出于学术目的(学习)还是 2。这是一个更加复杂的场景的简化版本?
-
@Christopher 我没有任何控制台代码。 c# 代码在运行时使用表达式编译,这意味着控制台应用程序是一个完全不同的程序