Я пишу настраиваемый инструмент на основе Roslyn, который пытается искоренить CS0834, переписав заданные многострочные lambdas в деревья выражений во время сборки.
Изменить. На данный момент я использую только анонимные многострочные lambdas.
Например:
// Will produce CS0834 if Bar takes Expression<Action<...>>
Foo.Bar((int x) => { ... });
к
Foo.Bar(Expression.Lambda<Action<int>>(
Expression.Block(
...
),
Expression.Parameter(typeof(int))));
Итак, это будет правильно составлено. Хотя я могу выяснить синтаксис Expression. (Blah), необходимый для преобразования данного кода, делать это с помощью Roslyn - это совсем другое дело. Возможно, я просто не знаю API-интерфейса Roslyn. (Blah) достаточно хорошо, чтобы перевести эту необработанную лямбду
(int index, float[] a, float[] b) =>
{
var sum = 0f;
for (int i = 0; i < index; i++)
sum += a[i];
b[index] = sum;
});
Может ли кто-нибудь помочь мне написать синтаксис Roslyn Syntax. (blah), который будет генерировать дерево выражений, которое выглядит следующим образом:
Expression<Action<int, float[], float[]>> action =
Expression.Lambda(
Expression.Block(
Expression.Assign(sumParameter, Expression.Constant(0)),
Expression.Loop(...) // The for loop here
)
);
Как только у меня есть отправная точка - я должен быть в состоянии выяснить или хотя бы начать перевод простых случаев в этом проекте.
Большое спасибо, ваша помощь очень ценится.