public static ExecutionNode Compile(Expression expression, ConstantExpression[] constExpressions, ParameterExpression[] parameterExpressions) { if (expression == null) { return(NullNode.Instance); } if (constExpressions == null) { throw new ArgumentNullException("constExpressions"); } if (parameterExpressions == null) { throw new ArgumentNullException("parameterExpressions"); } switch (expression.NodeType) { case ExpressionType.ArrayIndex: return(new ArrayIndexNode(expression, constExpressions, parameterExpressions)); case ExpressionType.Coalesce: return(new CoalesceNode((BinaryExpression)expression, constExpressions, parameterExpressions)); case ExpressionType.Add: case ExpressionType.AddChecked: case ExpressionType.And: case ExpressionType.AndAlso: case ExpressionType.Divide: case ExpressionType.Equal: case ExpressionType.ExclusiveOr: case ExpressionType.GreaterThan: case ExpressionType.GreaterThanOrEqual: case ExpressionType.LeftShift: case ExpressionType.LessThan: case ExpressionType.LessThanOrEqual: case ExpressionType.Modulo: case ExpressionType.Multiply: case ExpressionType.MultiplyChecked: case ExpressionType.NotEqual: case ExpressionType.Or: case ExpressionType.OrElse: case ExpressionType.Power: case ExpressionType.RightShift: case ExpressionType.Subtract: case ExpressionType.SubtractChecked: return(BinaryNode.Create((BinaryExpression)expression, constExpressions, parameterExpressions)); case ExpressionType.ArrayLength: return(new ArrayLengthNode((UnaryExpression)expression, constExpressions, parameterExpressions)); case ExpressionType.Negate: case ExpressionType.UnaryPlus: case ExpressionType.NegateChecked: case ExpressionType.Not: return(UnaryNode.Create((UnaryExpression)expression, constExpressions, parameterExpressions)); case ExpressionType.Quote: return(new QuoteNode((UnaryExpression)expression)); case ExpressionType.Call: return(new CallNode((MethodCallExpression)expression, constExpressions, parameterExpressions)); case ExpressionType.Conditional: return(new ConditionalNode((ConditionalExpression)expression, constExpressions, parameterExpressions)); case ExpressionType.Constant: return(new ConstantNode((ConstantExpression)expression, constExpressions)); case ExpressionType.Invoke: return(new InvocationNode((InvocationExpression)expression, constExpressions, parameterExpressions)); case ExpressionType.Lambda: return(new LambdaNode((LambdaExpression)expression, parameterExpressions)); case ExpressionType.ListInit: return(new ListInitNode((ListInitExpression)expression, constExpressions, parameterExpressions)); case ExpressionType.MemberAccess: return(new MemberAccessNode((MemberExpression)expression, constExpressions, parameterExpressions)); case ExpressionType.MemberInit: return(new MemberInitNode((MemberInitExpression)expression, constExpressions, parameterExpressions)); case ExpressionType.New: return(new NewNode((NewExpression)expression, constExpressions, parameterExpressions)); case ExpressionType.NewArrayInit: return(new NewArrayInitNode((NewArrayExpression)expression, constExpressions, parameterExpressions)); case ExpressionType.NewArrayBounds: return(new NewArrayBoundsNode((NewArrayExpression)expression, constExpressions, parameterExpressions)); case ExpressionType.Parameter: return(new ParameterNode((ParameterExpression)expression, parameterExpressions)); case ExpressionType.Convert: case ExpressionType.ConvertChecked: return(new ConvertNode((UnaryExpression)expression, constExpressions, parameterExpressions)); case ExpressionType.TypeAs: return(new TypeAsNode((UnaryExpression)expression, constExpressions, parameterExpressions)); case ExpressionType.TypeIs: return(new TypeIsNode((TypeBinaryExpression)expression, constExpressions, parameterExpressions)); default: throw new InvalidOperationException(string.Format(Properties.Resources.EXCEPTION_COMPIL_UNKNOWNEXPRTYPE, expression.Type)); } }