Я создал фильтруемый BindingList из этого источника. Он отлично работает:
list.Filter("Customer == 'Name'");
делает то, что нужно. Внутренности работают как парсер, который преобразует выражение ==
или !=
в System.Linq.Expressions.Expression
. В этом случае ==
становится System.Linq.Expressions.Expression.Equal
.
К сожалению, System.Linq.Expressions.Expression
не содержит подобный оператор, и я не знаю, как это решить.
Начальный код выглядит следующим образом:
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);
}
Затем я создал выражение, которое будет делать то, что я хочу:
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();
например.
Console.WriteLine(like("McDonalds", "donAld")); // true
Console.WriteLine(like("McDonalds", "King")); // false
Но binaryOpFactory
требует этого:
Func<Expression, Expression, Expression>
Предопределенные выражения выглядят точно так:
System.Linq.Expressions.Expression.Or;
Может ли кто-нибудь сказать мне, как преобразовать мое выражение?