Tôi cố gắng để tạo ra một lớp PredicateBuilder<T>
mà kết thúc tốt đẹp một Expression<Func<T, bool>>
và cung cấp một số phương pháp để dễ dàng xây dựng một biểu thức với nhiều And
và Or
phương pháp. Tôi nghĩ sẽ thật thú vị nếu tôi có thể sử dụng trực tiếp số PredicateBuilder<T>
này làm số Expression<Func<T, bool>>
và nghĩ rằng điều này có thể được thực hiện bằng cách có phương thức implicit operator
.C#: điều hành ngầm và mở rộng các phương pháp
Stripped xuống phiên bản của lớp trông như thế này:
class PredicateBuilder<T>
{
public Expression<Func<T, bool>> Predicate { get; protected set; }
public PredicateBuilder(bool initialPredicate)
{
Predicate = initialPredicate
? (Expression<Func<T, bool>>) (x => true)
: x => false;
}
public static implicit operator Expression<Func<T, bool>>(
PredicateBuilder<T> expressionBuilder)
{
return expressionBuilder.Predicate;
}
}
Sau đó, cũng giống như một bài kiểm tra, tôi có phương pháp gia hạn này trong một lớp tĩnh:
public static void PrintExpression<T>(this Expression<Func<T, bool>> expression)
{
Console.WriteLine(expression);
}
Trong đầu tôi, tôi sau đó có thể thực hiện những việc sau:
var p = new PredicateBuilder<int>(true);
p.PrintExpression();
PredicateExtensions.PrintExpression(p);
Tuy nhiên, không ai trong số họ làm việc. Đối với người đầu tiên, phương pháp mở rộng không được tìm thấy. Và thứ hai, nó nói rằng
Các đối số kiểu cho phương thức 'ExtravagantExpressions.PredicateHelper.PrintExpression (System.Linq.Expressions.Expression>)' không thể suy ra từ cách sử dụng. Hãy thử xác định các đối số kiểu một cách rõ ràng.
Vì vậy, tôi đã cố gắng điều sau đây, mà làm việc:
PredicateExtensions.PrintExpression<int>(p);
Ngoài ra, công trình này, tất nhiên:
((Expression<Func<int, bool>>) p).PrintExpression();
Nhưng yeah ... tại sao không phải là người khác làm việc? Tôi đã hiểu nhầm điều gì đó về cách hoạt động của điều này implicit operator
?
Cảm ơn bạn đã dọn dẹp! Tôi tiếp tục viết phần mở rộng thay vì gia hạn ... Tôi không biết tại sao! Tôi chỉ ... không thể ... dừng lại ... = S – Svish