gpt4 book ai didi

c# - 我可以使用 System.Linq.Expressions 动态生成异步方法吗?

转载 作者:IT王子 更新时间:2023-10-29 04:49:51 24 4
gpt4 key购买 nike

我知道编译器无法将异步 lambda 表达式转换为表达式树,但是否可以手动生成表达式树?

var expr = Expression.Lambda<Func<Task>>(
// how do I use 'await' in the body here?
);
var func = expr.Compile();

我在 Expression 类中找不到任何与 asyncawait 相关的方法,但也许还有另一种方法?

最佳答案

await 涉及重要 编译器重写;生成的 IL 与原始 C# 非常不同,具有变量提升(到类上)和分支、任务、延续等。它肯定不是可以用简单 lambda 表示的东西,虽然在最新版本的 .NET 中具有更丰富的 Expression 支持(Expression.Block 等),技术上我认为它可能可以模仿大部分编译器为 await 所做的事情 - 但如果您尝试手动执行它,您可能会变得非常疯狂。

不,据我所知,Expression API 中不存在自动化这种翻译的工具,坦率地说,我从来没有期望过会有这种工具。

ILGenerator 可能也是如此;坦率地说,AFAIK 在元编程中使用 await 的唯一“简单”方法(我用“简单”这个词很不正确)是生成 C# 并通过 roslyn 或 CSharpCodeProvider 运行它

关于c# - 我可以使用 System.Linq.Expressions 动态生成异步方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24240702/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com