예제 #1
0
        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);
        }