public Expression Compile(ParameterExpression paramex) { Expression memberex = null; Expression constex = Expression.Constant(RightOperand, RightOperand.GetType()); { Match match = regex_index.Match(LeftOperand); if (match.Success) { do { if (memberex == null) { memberex = Expression.PropertyOrField(paramex, match.Groups["name"].Value); } else { memberex = Expression.PropertyOrField(memberex, match.Groups["name"].Value); } int index; if (int.TryParse(match.Groups["index"].Value, out index)) { memberex = Expression.Property(memberex, "Item", Expression.Constant(index, typeof(int))); } } while ((match = match.NextMatch()).Success); } else { memberex = Expression.PropertyOrField(paramex, LeftOperand); } } Expression condex; switch (Operator) { case ExpressionOperator.Equal: condex = Expression.Equal(memberex, constex); break; case ExpressionOperator.NotEqual: condex = Expression.NotEqual(memberex, constex); break; case ExpressionOperator.LessThan: condex = Expression.LessThan(memberex, constex); break; case ExpressionOperator.LessEqual: condex = Expression.LessThanOrEqual(memberex, constex); break; case ExpressionOperator.GreaterThan: condex = Expression.GreaterThan(memberex, constex); break; case ExpressionOperator.GreaterEqual: condex = Expression.GreaterThanOrEqual(memberex, constex); break; case ExpressionOperator.Contains: condex = Expression.Call(memberex, typeof(string).GetMethod("Contains", new Type[] { typeof(string) }), constex); break; case ExpressionOperator.NotContains: condex = Expression.Not(Expression.Call(memberex, typeof(string).GetMethod("Contains", new Type[] { typeof(string) }), constex)); break; case ExpressionOperator.BeginWith: condex = Expression.Equal(Expression.Call(memberex, typeof(string).GetMethod("IndexOf", new Type[] { typeof(string) }), constex), Expression.Constant(0, typeof(int))); break; case ExpressionOperator.NotBeginWith: condex = Expression.NotEqual(Expression.Call(memberex, typeof(string).GetMethod("IndexOf", new Type[] { typeof(string) }), constex), Expression.Constant(0, typeof(int))); break; case ExpressionOperator.EndWith: // returns memberex.LastIndexOf( constex ) == ( memberex.Length - constex.Length ) condex = Expression.Equal( Expression.Call(memberex, typeof(string).GetMethod("LastIndexOf", new Type[] { typeof(string) }), constex), Expression.Subtract(Expression.PropertyOrField(memberex, "Length"), Expression.PropertyOrField(constex, "Length"))); break; case ExpressionOperator.NotEndWith: // returns memberex.LastIndexOf( constex ) != ( memberex.Length - constex.Length ) condex = Expression.NotEqual( Expression.Call(memberex, typeof(string).GetMethod("LastIndexOf", new Type[] { typeof(string) }), constex), Expression.Subtract(Expression.PropertyOrField(memberex, "Length"), Expression.PropertyOrField(constex, "Length"))); break; case ExpressionOperator.ArrayContains: // returns Enumerable.Contains<>( memberex ) condex = Expression.Call(typeof(Enumerable), "Contains", new Type[] { memberex.Type.GetElementType() ?? memberex.Type.GetGenericArguments().First() }, memberex, constex); break; case ExpressionOperator.ArrayNotContains: // returns !Enumerable.Contains<>( memberex ) condex = Expression.Not(Expression.Call(typeof(Enumerable), "Contains", new Type[] { memberex.Type.GetElementType() ?? memberex.Type.GetGenericArguments().First() }, memberex, constex)); break; default: throw new NotImplementedException(); } return(condex); }