Параметры ByRef с деревьями выражений в C #

Если бы я хотел создать дерево выражений, которое вызывало метод с параметром out , а затем возвращало значение out как результат ... как бы я это сделал?

Следующее не работает (генерирует исключение времени выполнения), но, возможно, лучше всего демонстрирует то, что я пытаюсь сделать:

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

Я знаю, что это довольно легко решить в исходном коде IL (или вообще без компиляции времени выполнения), но, к сожалению, это часть гораздо более крупного процесса построения выражений ... так что я очень надеюсь, что это не ограничение, поскольку полная перезапись будет больше, чем немного боль.

7
задан Mania 14 December 2011 в 12:37
поделиться