Si quisiera crear un árbol de expresiones que llamara a un método con un parámetro out
y luego devolviera el valor out
como resultado ... ¿cómo lo haría?Parámetros de ByRef con árboles de expresiones en C#
El siguiente no funciona (una excepción de tiempo de ejecución), pero quizás mejor demuestra lo que estoy tratando de hacer:
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);
}
Sé que esto puede resolverse con bastante facilidad en crudo IL (o, de hecho, sin compilación en tiempo de ejecución), pero desafortunadamente esto es parte de un proceso de construcción de expresiones mucho más grande ... así que realmente espero que esto no sea una limitación, ya que una reescritura completa sería más que un dolor.
funciones Lambda sin duda puede llamar a métodos que tienen 'ref' /' parámetros out' (como en cuestión), lo que no pueden hacer es referirse a 'ref' del método de encerramiento /' parámetros out'. – Mania