Подтвердить что ты не робот

Могу ли я генерировать асинхронный метод динамически с помощью System.Linq.Expressions?

Я знаю, что компилятор не может преобразовать выражение async lambda в дерево выражений, но можно ли генерировать дерево выражений вручную?

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

Я не могу найти какой-либо метод, относящийся к async или await в классе Expression, но, возможно, есть другой способ?

4b9b3361

Ответ 1

await включает перезапись компилятора значительный; сгенерированный ИЛ совсем не похож на исходный С# с переменным подъемом (на класс) и ветвлением, задачами, продолжениями и т.д. Конечно, это не то, что может быть представлено в простой лямбда, хотя в последних версиях .NET с более богатой поддержкой Expression (Expression.Block и т.д.), технически я предполагаю, что возможно, возможно, подражать большинству вещей, которые компилятор делает для await, - но вы, вероятно, пойдете довольно осторожно, пытаясь сделать это вручную.

Нет, AFAIK, никакой возможности для автоматизации этого перевода не существует в API Expression, и, честно говоря, я никогда не ожидал, что он будет.

То же самое можно сказать о ILGenerator; откровенно говоря, AFAIK - единственный "простой" способ (и я использую слово "легко" совершенно неправильно) использовать await в метапрограммировании - это сгенерировать С# и запустить его через roslyn или CSharpCodeProvider.