簡體   English   中英

Roslyn流暢的語法為多行lambda創建表達式樹

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM