Если бы я хотел создать дерево выражений, которое вызывало метод с параметром 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 (или вообще без компиляции времени выполнения), но, к сожалению, это часть гораздо более крупного процесса построения выражений ... так что я очень надеюсь, что это не ограничение, поскольку полная перезапись будет больше, чем немного боль.