Если мне захотелось создать дерево выражений, которое вызвало метод с параметром out
, а затем вернуло значение out
.. как бы я это сделал?Параметры ByRef с деревьями выражений в C#
Следующая не работает (выдает исключение времени выполнения), но, возможно, лучше всего демонстрирует то, что я пытаюсь сделать:
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 (или даже без компиляция во время выполнения), но, к сожалению, это часть гораздо более крупного процесса построения выражения ... поэтому я действительно надеюсь, что это не ограничение, так как полная переписывание будет более чем немного боли.
Лямбда-функции, безусловно, могут вызывать методы, которые имеют параметры 'ref' /' out' (как в вопросе), то, что они не могут сделать, относятся к параметрам 'ref' /' out' в приложении. – Mania