13

ビルド時に指定された複数行のラムダを式ツリーに書き換えることでCS0834を根絶しようとする Roslyn ベースのカスタム ツールを作成しています。

編集:現時点では、匿名の複数行ラムダのみを対象としています。

例えば:

    // 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 をよく知らないだけで、この生のラムダを変換することができません。

    (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
                )
            );

出発点ができたら、このプロジェクトで単純なケースを理解するか、少なくとも翻訳を開始できるはずです。

どうもありがとう、あなたの助けは大歓迎です。

4

1 に答える 1

13

構文を生成するQuoterというツールがあります。*任意のC#プログラムのAPI呼び出し。

roslynquoter.azurewebsites.netでライブで見ることができます。

Expression。*呼び出しを生成するロジックを理解すると、それを生成するコードを簡単に生成できます。

更新:ツールがオープンソースになりました!https://github.com/KirillOsenkov/RoslynQuoter

于 2012-09-18T23:02:30.530 に答える