I know the compiler can't convert an async lambda expression to an expression tree, but is it possible to generate the expression tree manually ?
var expr = Expression.Lambda<Func<Task>>( // how do I use 'await' in the body here? ); var func = expr.Compile();
I can't find any method related to
await in the
Expression class, but perhaps there's another way?
await involves significant compiler re-writing; the generated IL is quite dissimilar to the original C#, with variable hoisting (onto a class) and branching, tasks, continuations, etc. It certainly isn't something that can be represented in a simple lambda, although in recent versions of .NET with richer
Expression support (
Expression.Block etc), technically I suppose it is probably possible to mimic most of the things the compiler does for
await - but you'd probably go quite loopy trying to do it by hand.
No, AFAIK, no facility to automate this translation exists in the
Expression API, and frankly I wouldn't ever expect there to be.
The same probably could be say of
ILGenerator; frankly, AFAIK the only "easy" way (and I use the word "easy" quite incorrectly) to use
await in meta-programming would be to generate C# and run it through roslyn or