【发布时间】:2012-09-11 03:44:17
【问题描述】:
我正在编写一个基于 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
)
);
一旦我有了一个起点 - 我应该能够弄清楚或至少开始翻译这个项目中的简单案例。
非常感谢,非常感谢您的帮助。
【问题讨论】:
标签: c# .net metaprogramming expression-trees roslyn