[英]Roslyn fluent syntax to create expression tree for multiline lambda
我正在编写一个基于Roslyn的自定义工具,它试图通过在构建时将给定的多行lambda重写为Expression树来消除CS0834 。
编辑 :目前,我只针对匿名多行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完成它是另一回事。 也许我只是不知道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
)
);
一旦我有了一个起点 - 我应该能够弄清楚或者至少开始翻译这个项目中的简单案例。
非常感谢,非常感谢您的帮助。
我们有一个名为Quoter的工具,它将为任何C#程序生成语法。* API调用 。
您可以在roslynquoter.azurewebsites.net上查看 。
如果你弄清楚生成Expression。*调用的逻辑,你可以轻松生成生成它的代码。
更新:该工具现在是开源的! https://github.com/KirillOsenkov/RoslynQuoter
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.