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?