我正在编写一个基于Roslyn的自定义工具,旨在在构建时通过重写给定的多行Lambda表达式为表达式树来消除CS0834错误。
编辑:目前,我仅针对匿名多行Lambda表达式进行处理。
例如:
// 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进行此操作则完全是另一回事。也许我对Roslyn Syntax.(blah) API的掌握还不够,无法翻译这个原始的lambda表达式。
(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
)
);
一旦我有了一个起点,我应该能够找出或者至少开始翻译这个项目中的简单案例。
非常感谢,非常感谢你的帮助。