Nếu tôi muốn tạo một cây biểu thức được gọi là phương thức có tham số out
và sau đó trả về giá trị out
.. làm cách nào để tôi thực hiện?Các tham số ByRef với cây biểu thức trong C#
Sau đây không hoạt động (ném một ngoại lệ thời gian chạy), nhưng có lẽ tốt nhất chứng minh những gì tôi đang cố gắng để làm:
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);
}
Tôi biết điều này có thể được khá dễ dàng giải quyết trong tình trạng thô IL (hoặc thực sự không biên dịch thời gian ở tất cả), nhưng tiếc là đây là một phần của một quá trình xây dựng biểu thức lớn hơn nhiều ... vì vậy tôi thực sự hy vọng đây không phải là một hạn chế, như viết lại hoàn toàn sẽ là nhiều hơn một chút đau.
Hàm Lambda chắc chắn có thể gọi các phương thức có tham số 'ref' /' out' (như trong câu hỏi), những gì chúng không thể làm là tham khảo các tham số 'ref' /' out' của phương thức kèm theo. – Mania