private object EvaluteFunctionCallExpression(FunctionCallExpression expression, VariableContext context)
        {
            List <object> parameters = new List <object>();

            for (int i = 0; i <= expression.Parameters.Length - 1; i++)
            {
                object p = Evaluate(expression.Parameters[i], context);

                parameters.Add(p);
            }

            if (expression.Method.GetParameters().Length > 0 && expression.Method.GetParameters().Last().ParameterType == typeof(VariableContext))
            {
                parameters.Add(context);
            }

            if (expression.MethodName == "Loop" || expression.MethodName.Contains("MCM") || expression.MethodName.Contains("Draw_"))
            {
                parameters.Add(context.GetValue("_EvaluationContext"));
            }

            if (expression.IsCustomFunc)
            {
                List <CoefficientDetail> data;
                if (context.HasVariable(expression.MethodName))
                {
                    data = (List <CoefficientDetail>)context.GetValue(expression.MethodName);
                }
                else
                {
                    var dal = new CoefficientDAL();
                    data = dal.GetCoefficientDetail(expression.MethodName);
                }
                //var a = Evaluate(expression.Parameters[0], context);
                var colName  = Convert.ToInt32(Evaluate(expression.Parameters[0], context));
                var rowIndex = Convert.ToInt32(Evaluate(expression.Parameters[1], context));
                return(Convert.ToDouble(data.FirstOrDefault(m => m.CoefficientDetailRow == rowIndex && m.CoefficientDetailIndex == colName).CoefficientDetailValue));
            }

            try
            {
                //可变参数处理
                if (expression.Parameters.Count() > 1 && parameters[0].GetType() != typeof(double[]))
                {
                    var p = new List <object>();
                    var o = new List <double[]>();
                    foreach (var n in parameters)
                    {
                        if (n.GetType() != typeof(double[]))
                        {
                            p.Add(n);
                        }
                        else
                        {
                            o.Add(n as double[]);
                        }
                    }
                    if (o.Count > 0)
                    {
                        p.Add(o.ToArray());
                        parameters = p;
                    }
                }
                return(expression.Method.Invoke(this, parameters.ToArray()));
            }
            catch (Exception ex)
            {
                throw ex;
                // throw new Exception(expression.MethodName + "\r\n" + (ex.InnerException == null ? ex.Message : ex.InnerException.Message));
            }
        }
        private object EvaluateIterationSumExpression(IterationSumExpression e, VariableContext context)
        {
            int[] values     = new int[e.Variables.Length];
            int[] fromValues = new int[e.Variables.Length];
            int[] toValues   = new int[e.Variables.Length];

            int index = 0;

            foreach (IterationSumVariable variable in e.Variables)
            {
                if (context.HasVariable(variable.Name))
                {
                    throw new Exception(string.Format("Iteration variable {0} is already in use.", variable.Name));
                }


                fromValues[index] = Types.ConvertValue <int>(Evaluate(variable.From, context));
                toValues[index]   = Types.ConvertValue <int>(Evaluate(variable.To, context));

                context.Set(variable.Name, fromValues[index]);
                values[index] = fromValues[index];


                index++;
            }


            double sum = 0;

            while (true)
            {
                double value = Types.ConvertValue <double>(Evaluate(e.Body, context));;

                if (!double.IsNaN(value))
                {
                    sum += value;
                }


                if (!IncreaseIterationValues(values, fromValues, toValues))
                {
                    break;
                }
                else
                {
                    for (int i = 0; i <= e.Variables.Length - 1; i++)
                    {
                        context.Set(e.Variables[i].Name, values[i]);
                    }
                }
            }


            foreach (IterationSumVariable variable in e.Variables)
            {
                context.Remove(variable.Name);
            }


            return(sum);
        }