Se volevo creare un albero di espressioni che chiamasse un metodo con un parametro out
e quindi restituisse il valore out
come risultato .. come potrei farlo?Parametri ByRef con alberi di espressione in C#
Quanto segue non funziona (genera un'eccezione di runtime), ma forse meglio dimostra quello che sto cercando di fare:
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);
}
So che questo può essere abbastanza facilmente risolto in IL prima (o anche senza compilazione di runtime a tutti), ma sfortunatamente questo fa parte di un processo di creazione di espressioni molto più grande ... quindi spero davvero che questa non sia una limitazione, in quanto una riscrittura completa sarebbe più di un po 'di dolore.
Le funzioni lambda possono certamente chiamare metodi che hanno parametri 'ref' /' out' (come in questione), ciò che non possono fare è fare riferimento ai parametri 'ref' /' out' del metodo che li racchiude. – Mania