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); }