Kann ich eine dynamische Async-Methode mithilfe von System.Linq.Expressions generieren?

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

Frage

Ich weiß, dass der Compiler einen asynchronen Lambda-Ausdruck nicht in einen Ausdrucksbaum konvertieren kann, aber ist es möglich, den Ausdrucksbaum manuell zu erzeugen?

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

Ich kann keine async Methode finden oder in der Expression Klasse await , aber vielleicht gibt es einen anderen Weg?

Akzeptierte Antwort

await beinhaltet ein signifikantes Compiler-Re-Writing; Die generierte IL ist der ursprünglichen C # sehr ähnlich, mit variablem Heben (auf eine Klasse) und Verzweigungen, Aufgaben, Fortsetzungen usw. Es ist sicherlich nicht etwas, das in einem einfachen Lambda dargestellt werden kann, obwohl es in neueren Versionen von .NET ist Mit einer umfangreicheren Expression Unterstützung ( Expression.Block usw.) ist es wahrscheinlich technisch möglich, die meisten Dinge nachzuahmen, die der Compiler await - aber Sie würden wahrscheinlich ziemlich schlau werden, wenn Sie versuchen, es von Hand zu machen.

Nein, AFAIK, in der Expression API gibt es keine Möglichkeit, diese Übersetzung zu automatisieren , und ehrlich gesagt würde ich das niemals erwarten.

Das gleiche könnte wahrscheinlich von ILGenerator ; ehrlich gesagt, AFAIK der einzige "einfache" Weg (und ich benutze das Wort "easy" ganz falsch) zu verwenden await in Meta-Programmierung würde C # generieren und es durch Roslyn oder CSharpCodeProvider .



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum