【问题标题】:Roslyn fluent syntax to create expression tree for multiline lambdaRoslyn 流利的语法为多行 lambda 创建表达式树
【发布时间】: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


    【解决方案1】:

    我们有a tool called Quoter that will generate Syntax.* API calls for any C# program

    你可以view it live at roslynquoter.azurewebsites.net

    如果您弄清楚生成 Expression.* 调用的逻辑,您可以轻松生成生成它的代码。

    更新:该工具现已开源! https://github.com/KirillOsenkov/RoslynQuoter

    【讨论】:

    • 太棒了,谢谢!是的 - 我知道如何在给定 Roslyn 语法树的情况下生成相应的表达式树。我使用了一个特殊的访问者,它遍历语法树但返回表达式而不是 SyntaxNodes。一个相关的问题是,我可以在我的开源应用程序 Brahma (brahma.ananthonline.net) 中使用 Quoter 并注明出处吗?再次感谢。
    • 完美。这正是我所需要的。 :)
    • 当然。 Quoter 在 Apache 2.0 许可下,所以你应该可以使用它。
    • @ananthonline:你有没有绕过利用这些信息?例如,是否有使用引用器生成 Expression.* 调用的项目?
    • TL;DR:不。长版本:我确实编写了一些代码 - 但从未发布使用它的新版本 Brahma。代码生成机制是 VS-only 的,这使得它很麻烦,而且对其他事情没有多大用处。我决定推迟 Brahma,直到 C# 可以为带有实体的 lambdas 生成表达式树。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多