Paramètres ByRef avec arbres d'expression en C #

c# expression-trees

Question

Si je voulais créer un arbre d'expression qui appelait une méthode avec un paramètre out puis renvoyait la valeur out tant que résultat, comment procéder?

Ce qui suit ne fonctionne pas (lève une exception d'exécution), mais c'est peut-être mieux ce que j'essaie de faire:

private delegate void MyDelegate(out int value);
private static Func<int> Wrap(MyDelegate dele)
{
    MethodInfo fn = dele.Method;
    ParameterExpression result = ParameterExpression.Variable(typeof(int));
    BlockExpression block = BlockExpression.Block(
        typeof(int), // block result
        Expression.Call(fn, result), // hopefully result is coerced to a reference
        result); // return the variable
    return Expression.Lambda<Func<int>>(block).Compile();
}

private static void TestFunction(out int value)
{
    value = 1;
}

private static void Test()
{
    Debug.Assert(Wrap(TestFunction)() == 1);
}

Je sais que cela peut être assez facilement résolu en IL brut (ou même sans compilation), mais malheureusement, cela fait partie d'un processus de création d'expression beaucoup plus vaste ... une réécriture complète serait plus qu'un peu pénible.

Réponse acceptée

Cela fonctionne pour moi:

    private static Func<int> Wrap(MyDelegate dele)
    {
        var fn = dele.Method;
        var result = ParameterExpression.Variable(typeof(int));
        var block = BlockExpression.Block(
            typeof(int),
            new[] { result },
            new Expression[]
            {
                Expression.Call(fn, result),
                result,
            });
        return Expression.Lambda<Func<int>>(block).Compile();
    }


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi