Sintassi fluente di Roslyn per creare un albero di espressioni per lambda multilinea

.net c# expression-trees metaprogramming roslyn

Domanda

Sto scrivendo uno strumento personalizzato basato su Roslyn che tenta di sradicare CS0834 riscrivendo i lambda multi-linea in alberi di espressione in fase di costruzione.

Modifica : attualmente mi rivolgo solo ai lambda multiramo anonimi.

Per esempio:

    // Will produce CS0834 if Bar takes Expression<Action<...>>
    Foo.Bar((int x) => { ... });

a

    Foo.Bar(Expression.Lambda<Action<int>>(
        Expression.Block(
            ...
            ),
        Expression.Parameter(typeof(int))));

In modo che si compili correttamente. Mentre riesco a capire la sintassi di Expression. (Blah) richiesta per convertire il codice dato, farlo con Roslyn è un'altra questione. Forse non conosco l'API di Roslyn Syntax. Blah abbastanza bene da tradurre questo lambda crudo

    (int index, float[] a, float[] b) =>
    {
        var sum = 0f;
        for (int i = 0; i < index; i++)
            sum += a[i];

        b[index] = sum;
    });

Qualcuno potrebbe aiutarmi a scrivere la sintassi di Roslyn Syntax. (Blah) che genererà un albero delle espressioni simile a quello qui sotto?

    Expression<Action<int, float[], float[]>> action = 
        Expression.Lambda(
            Expression.Block(
                Expression.Assign(sumParameter, Expression.Constant(0)),
                Expression.Loop(...) // The for loop here
                )
            );

Una volta che ho un punto di partenza, dovrei essere in grado di capire o almeno iniziare a tradurre casi semplici in questo progetto.

Molte grazie, il tuo aiuto è molto apprezzato.

Risposta accettata

Abbiamo uno strumento chiamato Quoter che genererà la sintassi. * Le chiamate API per qualsiasi programma C # .

Puoi vederlo dal vivo su roslynquoter.azurewebsites.net .

Se si individua la logica per generare le chiamate Expression. *, È possibile generare facilmente il codice che lo genera.

Aggiornamento: lo strumento è ora open-source! https://github.com/KirillOsenkov/RoslynQuoter



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché