ByRef-Parameter mit Ausdrucksbäumen in C #

c# expression-trees

Frage

Wenn ich einen Ausdrucksbaum erstellen wollte, der eine Methode mit einem out Parameter aufgerufen hat und dann als Ergebnis den out Wert zurückgegeben hat .. wie würde ich darüber gehen?

Folgendes funktioniert nicht (löst eine Laufzeitausnahme aus), zeigt aber am besten, was ich versuche zu tun:

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

Ich weiß, dass dies relativ einfach in roher IL (oder überhaupt ohne Laufzeitkompilierung) gelöst werden kann, aber leider ist dies Teil eines viel größeren Ausdrucksaufbauprozesses ... also hoffe ich wirklich, dass dies keine Einschränkung ist, wie Eine vollständige Neuschreibung wäre mehr als nur ein bisschen Schmerz.

Akzeptierte Antwort

Das funktioniert für mich:

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


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum