c# linq async-await code-generation expression-trees

c# - ¿Puedo generar un método asíncrono dinámicamente usando System.Linq.Expressions?



async-await code-generation (1)

await implica una reescritura significativa del compilador; El IL generado es bastante diferente del C # original, con elevación variable (en una clase) y bifurcación, tareas, continuaciones, etc. Ciertamente no es algo que se pueda representar en un simple lambda, aunque en versiones recientes de .NET con un soporte de Expression más rico ( Expression.Block etc.), técnicamente supongo que es probable que sea posible imitar la mayoría de las cosas que el compilador hace por await , pero es probable que te vuelvas loco intentando hacerlo a mano.

No, AFAIK, no existe ninguna facilidad para automatizar esta traducción en la API de Expression , y, francamente, nunca esperaría que existiera.

Lo mismo podría decirse de ILGenerator ; francamente, AFAIK, la única manera "fácil" (y yo uso la palabra "fácil" de manera incorrecta) para usar await en la meta-programación sería generar C # y ejecutarlo a través de Roslyn o CSharpCodeProvider .

Sé que el compilador no puede convertir una expresión lambda asíncrona en un árbol de expresiones, pero ¿es posible generar el árbol de expresiones manualmente?

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

No puedo encontrar ningún método relacionado con async o await en la clase de Expression , pero ¿tal vez hay otra forma?