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?