Tôi đã đọc this answer và hiểu từ trường hợp cụ thể nó nổi bật, đó là khi bạn có một lambda bên trong lambda khác và bạn không muốn vô tình có lambda bên trong cũng biên dịch với bên ngoài. Khi bên ngoài được biên dịch, bạn muốn biểu thức lambda bên trong vẫn là một cây biểu thức. Có, có, nó có ý nghĩa trích dẫn biểu thức lambda bên trong.Tại sao bạn báo giá LambdaExpression?
Nhưng đó là về nó, tôi tin. Có trường hợp sử dụng nào khác để trích dẫn một biểu thức lambda?
Và nếu không, tại sao tất cả các nhà khai thác LINQ là, ví dụ: các phần mở rộng trên IQueryable<T>
được tuyên bố trong đoạn trích Queryable
lớp vị từ hoặc lambdas họ nhận được như các đối số khi họ đóng gói thông tin trong MethodCallExpression
.
Tôi đã thử một ví dụ (và một vài người khác trong vài ngày qua) và dường như không có ý nghĩa gì khi báo một lambda trong trường hợp này.
Đây là biểu thức cuộc gọi phương thức cho phương thức dự kiến biểu thức lambda (và không phải là cá thể đại diện) làm tham số duy nhất của nó.
Tôi sau đó biên dịch MethodCallExpression
bằng cách gói nó bên trong một lambda.
Nhưng điều đó không biên dịch bên trong LambdaExpression
(đối số cho phương pháp GimmeExpression
). Nó để lại biểu thức lambda bên trong như một cây biểu thức và không tạo ra một cá thể đại biểu của nó.
Thực tế, nó hoạt động tốt mà không trích dẫn nó.
Và nếu tôi trích dẫn đối số, nó sẽ ngắt và cho tôi một lỗi chỉ ra rằng tôi đang chuyển sai loại đối số cho phương thức GimmeExpression
.
Thỏa thuận là gì? Trích dẫn tất cả điều này là gì?
private static void TestMethodCallCompilation()
{
var methodInfo = typeof(Program).GetMethod("GimmeExpression",
BindingFlags.NonPublic | BindingFlags.Static);
var lambdaExpression = Expression.Lambda<Func<bool>>(Expression.Constant(true));
var methodCallExpression = Expression.Call(null, methodInfo, lambdaExpression);
var wrapperLambda = Expression.Lambda(methodCallExpression);
wrapperLambda.Compile().DynamicInvoke();
}
private static void GimmeExpression(Expression<Func<bool>> exp)
{
Console.WriteLine(exp.GetType());
Console.WriteLine("Compiling and executing expression...");
Console.WriteLine(exp.Compile().Invoke());
}
Cảm ơn bạn rất nhiều. Tôi đã ở đây vài tháng rồi. Nó cuối cùng đã nhấp sau khi thực hiện rất nhiều ví dụ và suy nghĩ rất nhiều trong vài tháng qua về điều này. Tôi đã có một số giả thuyết về * tại sao * và một số trong số đó là đúng. Câu trả lời của bạn cũng đã giúp tôi. –