Puis-je générer une méthode asynchrone de façon dynamique à l'aide de System.Linq.Expressions?

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

Question

Je sais que le compilateur ne peut pas convertir une expression lambda async en un arbre d’expression, mais est-il possible de générer l’arbre d’expression manuellement?

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

Je ne trouve aucune méthode liée à async ou à await dans la classe Expression , mais peut-être existe-t-il un autre moyen?

Réponse acceptée

await implique une réécriture importante du compilateur; l'IL généré est assez différent du C # d'origine, avec un hissage variable (sur une classe) et des branches, des tâches, des continuations, etc. Ce n'est certainement pas quelque chose qui peut être représenté dans un simple lambda, bien que dans les versions récentes de .NET avec un support d’ Expression plus riche ( Expression.Block etc.), techniquement, je suppose qu’il est probablement possible d’imiter la plupart des choses que le compilateur fait dans l’ await - mais vous seriez probablement assez fou en essayant de le faire à la main.

Non, autant que je sache, aucune installation permettant d’ automatiser cette traduction n’existe dans l’API d’ Expression , et franchement, je ne l’attendrais jamais.

On pourrait probablement dire la même ILGenerator de ILGenerator ; franchement, autant que je sache le seul moyen « facile » (et j'utilise le mot « facile » tout à fait à tort) d'utiliser await dans la méta-programmation serait de générer C # et l' exécuter par Roslyn ou CSharpCodeProvider .



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow