public bool CheckExpressionItemValid() { //格式化大小写敏感 FormatAccordingtoIsDiffUpperOrLower(); //获取字符串的对象信息 _ExpressionItem = Utility.GetExpressionItemByParameter(_ExpressionItemList, _Parameter); _ExpressionItem.Expression = Utility.FormatExpressionBase(_ExpressionItem.Expression); //验证字符串中是否有敏感语法标识符 CheckExpressionStringFieldValid(); //分离字符串 string[] fields = _ExpressionItem.Expression.Split(Utility.CalculateSymbols, StringSplitOptions.None); //验证表达式中的字段是否有效 CheckExpressionFieldValid(fields); //格式化字符串 string formattedExpression = FormatExpression(fields); //带入进行测试运算 Expression exEvaluate = new Expression(formattedExpression); exEvaluate.TaxFunction += TaxFunction; exEvaluate.TaxWithPointFunction += TaxWithPointFunction; exEvaluate.AnnualBonusTaxFunction += AnnualBonusTaxFunction; exEvaluate.ForeignTaxFunction += ForeignTaxFunction; exEvaluate.AnnualBonusForeignTaxFunction += AnnualBonusForeignTaxFunction; exEvaluate.IsSalaryEndDateMonthEquelFunction += IsSalaryEndDateMonthEquelFunction; exEvaluate.DoubleSalaryFunction += DoubleSalaryFunction; object evaluateResult = exEvaluate.Evaluate(); //验证参数的返回类型是否正确 CheckResultDataType(evaluateResult); return(true); }
/// <summary> /// 将parameter中所用到的A1,A2,...An的值,递归替换成可计算的表达式 /// 假设已知公式A3=A2+A1*50,A2=A1+3,A1=100,通过递归后A3=(100)+3+(100)*50 /// 算法示例如下 /// 传入参数parameter=A3 /// GetItemByParameter根据parameter或取ExpressionItem对象,ExpressionItem.Parameter为A3,ExpressionItem.Expression为A2+A1*50 /// GetParameterFromExpression将A2+A1*50中提取出相关参数A1和A2 /// 先递归遍历A1,获取A1的表达式=100,替换A3公式中A1的部分,变为表达式A2+(100)*50 /// 再递归A2,或取A2的表达式=A1+3,根据GetParameterFromExpression发现A2中有相关参数A1,则再次遍历A1,替换A2公式中A1的部分,A2变为表达式(100)+3 /// A2递归结束后,替换A3公式中A2的部分,变为表达式(100)+3+(100)*50 /// </summary> /// <param name="parameter"></param> /// <returns></returns> private object ChangeParameterForCalculator(string parameter) { ExpressionItem expressionItem = Utility.GetExpressionItemByParameter(_ExpressionItemList, parameter); if (expressionItem == null) { throw new Exception(parameter + "没有定义,系统无法解释"); } if (expressionItem.ExpressionForCalculator != null) { return(expressionItem.ExpressionForCalculator);//已经递归,可直接返回结果 } //如果存在"<NULL>"说明条件值不够,不做计算,直接返回null if (expressionItem.Expression.Contains(Utility.NULLString)) { expressionItem.Expression = Utility.NULLString; } expressionItem.ExpressionForCalculator = expressionItem.Expression; //替换%为*0.01 expressionItem.ExpressionForCalculator = expressionItem.ExpressionForCalculator.Replace("%", "*0.01"); ArrayList paras = Utility.GetParameterFromExpression(expressionItem.Expression, _ParameterName); //获得相关参数,无重复 for (int i = 0; i < paras.Count; i++) { expressionItem.ExpressionForCalculator = expressionItem.ExpressionForCalculator.Replace(paras[i].ToString(), "(" + ChangeParameterForCalculator(paras[i].ToString()) + ")"); } return(expressionItem.ExpressionForCalculator); }
/// <summary> /// 根据参数名称,返回该参数的数据类型 /// </summary> /// <param name="parameter"></param> /// <param name="expressionItemList"></param> /// <returns></returns> public static EnumDataType GetDataTypeByParameter(List <ExpressionItem> expressionItemList, string parameter) { ExpressionItem item = GetExpressionItemByParameter(expressionItemList, parameter); if (item == null) { throw new Exception(parameter + "没有定义,系统无法解释"); } if (item.EnumDataType == EnumDataType.Other) { throw new Exception(parameter + "参数的数据类型不明,无法计算"); } return(item.EnumDataType); }
/// <summary> /// 检测parameter中所用到的A1,A2,...An的值,递归为dependenceMatrix赋值 /// </summary> /// <param name="parameter"></param> /// <returns></returns> private void FillDependenceMatrixByParameter(string parameter) { ExpressionItem expressionItem = Utility.GetExpressionItemByParameter(_ExpressionItemList, parameter); if (expressionItem == null) { throw new Exception(parameter + "没有定义,系统无法解释"); } //获得当前parameter在_ExpressionItemList的Index int parameterIndex = _ExpressionItemList.IndexOf(expressionItem); ArrayList paras = Utility.GetParameterFromExpression(expressionItem.Expression, _ParameterName); //获得相关参数,无重复 for (int i = 0; i < paras.Count; i++) { ExpressionItem factorExpressionItem = Utility.GetExpressionItemByParameter(_ExpressionItemList, paras[i].ToString()); if (factorExpressionItem == null) { throw new Exception(paras[i] + "没有定义,系统无法解释"); } //获得相关参数paras[i]在_ExpressionItemList的Index int factorIndex = _ExpressionItemList.IndexOf(factorExpressionItem); SetDependenceMatrixByParameterAndFactor(parameterIndex, factorIndex); //将factorIndex依赖的所有参数找出来,给parameterIndex和j确立依赖关系,即factorIndex得依赖项也是parameterIndex依赖项 for (int j = 0; j < _ExpressionItemList.Count; j++) { if (dependenceMatrix[factorIndex, j] == 1) { SetDependenceMatrixByParameterAndFactor(parameterIndex, j); } } FillDependenceMatrixByParameter(paras[i].ToString()); } //第parameterIndex个参数已经找过了所有要依赖的参数 isFillDependenceMatrix[parameterIndex] = true; }