如果我想創建一個調用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相當容易解決的(或不確實運行時編譯),但不幸的是,這是一個更大的表達式構建過程的一部分......所以我真的希望這不是一個限制,因爲完全重寫將不僅僅是一個痛苦。
Lambda函數當然可以調用具有`ref` /`out`參數的方法(如有問題),他們不能做的是引用封閉方法的`ref` /`out`參數。 – Mania 2011-12-14 13:44:02