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