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

时间:2014-06-16 09:40:21

标签: c# linq async-await code-generation expression-trees

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

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

我无法在async课程中找到与awaitExpression相关的任何方法,但也许还有另一种方法?

1 个答案:

答案 0 :(得分:16)

await涉及重要编译器重写;生成的IL与原始的C#完全不同,可变提升(在类上)和分支,任务,延续等等。它当然不是可以在简单 lambda中表示的东西,虽然在.NET的最新版本中有更丰富的Expression支持(Expression.Block等),但技术上我认为可能模仿编译器为{{{{{{{ 1}} - 但是你可能会试图用手来做它。

不,AFAIK,自动化这种翻译没有设施存在于await API中,坦率地说,我不会期望有这种翻译。

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