【发布时间】:2011-12-14 12:37:22
【问题描述】:
如果我想创建一个表达式树,它调用带有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 中相当容易地解决(或者实际上根本不需要运行时编译),但不幸的是,这是一个更大的表达式构建过程的一部分......所以我真的希望这不是一个限制,因为完全重写会很痛苦。
【问题讨论】:
-
Lambda 函数当然可以调用具有
ref/out参数的方法(如问题),它们不能做的是参考封闭方法的ref/out参数。
标签: c# expression-trees