我知道编译器无法将异步 lambda 表达式转换为表达式树,但是是否可以手动生成表达式树?
var expr = Expression.Lambda<Func<Task>>(
// how do I use 'await' in the body here?
);
var func = expr.Compile();
我找不到任何相关的方法async
or await
in the Expression
类,但也许还有另一种方法?
await
涉及重要的编译器重写;生成的 IL 与原始 C# 非常不同,具有变量提升(到类上)和分支、任务、延续等。它当然不能用simplelambda,尽管在最新版本的 .NET 中具有更丰富的功能Expression
支持 (Expression.Block
etc), 技术上我想可能可以模仿编译器所做的大部分事情await
- 但你可能会非常疯狂地尝试手动完成它。
不,据我所知,没有设施automate该翻译存在于Expression
API,坦白说我从来没想过会有。
可能也可以这样说ILGenerator
;坦率地说,据我所知,这是唯一“简单”的方式(我错误地使用了“简单”这个词)await
在元编程中将生成 C# 并通过 roslyn 或运行它CSharpCodeProvider
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)