Expression.Quote
chỉ định rằng lambda được coi là cây biểu thức chứ không phải là hàm. Nó gây ra ngữ nghĩa đóng cửa trên toán hạng của nó.
Khi bạn đang xây dựng một MethodCallExpression
sử dụng Expression.Call
, bất kỳ thông số đó là các biểu thức lambda (LambdaExpression
/Expression<TDelegate>
) phải sử dụng Expression.Quote
để bọc các thông số trước khi đi qua trong.
Vì vậy, đối với một số loại Expression<Func<bool>>
, khi bạn tạo một ví dụ như: () => true
, tài sản Type
của biểu thức như sau Func<bool>
trong khi kiểu của biểu thức (gọi GetType
) sẽ là Expression<Func<bool>>
vì vậy, để có được một Expression
có giá trị chính xác cho thuộc tính Type
bạn chuyển biểu thức lambda vào Expression.Quote
và chuyển giá trị đó làm tham số cho Expression.Call
.
Tôi đã xem Expression.Quote
thông qua phản xạ và trong khi tham số duy nhất là loại Expression
, nó phải lấy được từ LambdaExpression
và điều này được chọn bên trong phương thức. Không quan tâm, có ai biết tại sao MS không chỉ tạo kiểu tham số là LambdaExpression
?
Như StevenH đã chỉ ra, Expression.Quote
được sử dụng trong việc triển khai Nhà cung cấp truy vấn LINQ. Tất cả các phương thức trên Queryable
có biểu thức lambda chẳng hạn như Where
, OrderBy
, GroupBy
, v.v ... trong nội bộ xây dựng một MethodCallExpression
sử dụng Expression.Call
và bọc tham số biểu thức lambda với các cuộc gọi Expression.Quote
.
Để được giải thích chi tiết hơn về Expression.Quote
, hãy đọc số answer này.
"Khi bạn đang xây dựng MethodCallExpression bằng Expression.Call, bất kỳ tham số nào là biểu thức lambda (LambdaExpression/Expression) phải sử dụng Expression.Quote để bọc tham số trước khi chuyển vào." Điều đó có đúng không? Sử dụng .Net 4.5, tôi có thể vượt qua thành công biểu thức trần > mà không cần phải báo giá chúng với Expression.Quote(). –
Nếu tham số của bạn thuộc loại 'Func <>', thì chắc chắn đó là tất cả những gì bạn cần, nhưng trong trường hợp của nhiều phương thức mở rộng LINQ 'IQueryable', kiểu tham số thực sự là 'Expression >', và trong trường hợp đó bạn sẽ cần 'Expression.Quote'. Tôi đã không cố gắng làm điều này với. NET 4.5, nhưng tôi muốn giả định nó là như nhau. Tại thời điểm viết, tôi có thể sử dụng .NET 3.5. –
GiddyUpHorsey