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

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

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

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

await涉及重要的编译器重写; 生成的IL与原始的C#完全不同,包括变量提升(在类上)和分支,任务,延续等。虽然在.NET的最新版本中,它肯定不能用简单的 lambda表示。有了更丰富的Expression支持( Expression.Block等),从技术上讲,我认为它可能模仿编译器为await做的大部分事情 – 但是你可能会试图手动完成它。

不,AFAIK, Expression API中没有自动化这种翻译的工具,坦率地说,我不会期望有。

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