Tôi đã tạo BindingList from this source có thể lọc. Nó hoạt động tuyệt vời:Cách tạo System.Linq.Expressions.Expression cho Thích?
list.Filter("Customer == 'Name'");
làm những gì cần. Nội bộ hoạt động giống như trình phân tích cú pháp, chuyển đổi biểu thức ==
hoặc !=
thành System.Linq.Expressions.Expression
. Trong trường hợp này, ==
sẽ trở thành System.Linq.Expressions.Expression.Equal
.
Thật không may System.Linq.Expressions.Expression
không chứa nhà điều hành tương tự và tôi không biết cách giải quyết vấn đề này.
Mã ban đầu trông như thế này:
private static Dictionary<String, Func<Expression, Expression, Expression>>
binaryOpFactory = new Dictionary<String, Func<Expression, Expression, Expression>>();
static Init() {
binaryOpFactory.Add("==", Expression.Equal);
binaryOpFactory.Add(">", Expression.GreaterThan);
binaryOpFactory.Add("<", Expression.LessThan);
binaryOpFactory.Add(">=", Expression.GreaterThanOrEqual);
binaryOpFactory.Add("<=", Expression.LessThanOrEqual);
binaryOpFactory.Add("!=", Expression.NotEqual);
binaryOpFactory.Add("&&", Expression.And);
binaryOpFactory.Add("||", Expression.Or);
}
Sau đó, tôi tạo ra một biểu thức mà sẽ làm những gì tôi muốn:
private static System.Linq.Expressions.Expression<Func<String, String, bool>>
Like_Lambda = (item, search) => item.ToLower().Contains(search.ToLower());
private static Func<String, String, bool> Like = Like_Lambda.Compile();
ví dụ
Console.WriteLine(like("McDonalds", "donAld")); // true
Console.WriteLine(like("McDonalds", "King")); // false
Nhưng binaryOpFactory
đòi hỏi này:
Func<Expression, Expression, Expression>
Các biểu thức được xác định trước dường như là chính xác rằng:
System.Linq.Expressions.Expression.Or;
bất cứ ai có thể cho tôi biết làm thế nào để chuyển đổi biểu hiện của tôi không?
Và như thế nào NHƯ của bạn hoạt động? Tôi có thể giúp bạn xây dựng một biểu thức, nhưng tôi cần phải hiểu làm thế nào bạn muốn nó làm việc đầu tiên ... regex? chứa đựng? v.v. –
Điều đó không quan trọng. Việc thực hiện cuối cùng sẽ được thuận lợi với regexp. Về cơ bản tôi có một Func để tôi vượt qua 2 Strings và nhận được true hoặc false như returnvalue. Vấn đề của tôi là tôi không hiểu việc thực hiện các đối tượng trong System.Linq.Expressions.Expression Namespace, mà dường như là Func (xem các loại argements chung của binaryOpFactory) vì vậy tôi không thể tạo so sánh của riêng tôi. –
Hãy bình luận: hiểu được Expression API có thể làm một số việc ... Tôi cố gắng trình bày một vài điều cơ bản trên blog của mình; Cuốn sách của Jon (C# in Depth) cũng đưa ra một cái nhìn tổng quan ở mức cao. –