完成公式属性的基本能力>后台规则解析
这个功能是通过解析公式字段的字符串内容进行解析,在后台做出相应的逻辑,比如说字符传内容是“1*5-6”,可以进行数学计算,
要求的功能如下 至少满足以下要求
1、常规的加减乘除(数字的+-*/,文本的+)
2、常规的数学函数(max,min,count,sum,avg)
3、支持直接引入字段变量,如:a + b;
参考了三个连接
参考链接
https://github.com/ncalc/ncalc 这一个功能较少,暂时没有考虑
https://github.com/codingseb/ExpressionEvaluator 这个功能足够齐全,但我们考虑使用的方式其性能方面并不理想,暂不考虑
https://github.com/dynamicexpresso/DynamicExpresso 这个我们使用委托的方式进行的,对我们的使用场景操作效率较高
由于一张表每行数据都需要公式支持,所以为了节约性能我们使用,先将委托定义好,然后根据每行数据对应的条件来使用委托,代码如下
//定义字典,存储的是每行数据的id和对应的lambda公式
var expressionFun = new Dictionary<string, Lambda>();
//这条语句是插件的初始化 var interpreter = new Interpreter(InterpreterOptions.DefaultCaseInsensitive); var parameters = new List<Parameter>(); //parameters 是定义参数名,和类型 foreach (var field in fields) { foreach (var item in field.GetType().GetProperties()) { parameters.Add(new Parameter(item.Name, item.PropertyType.Name)); } break; }
//这里是多余的原因是我们的数据结构fields是一个对象,外部的字段也需要使用到,所以这里 又多添加了一次 foreach (var entity in entitys) { foreach (var item in entity.GetType().GetProperties()) { parameters.Add(new Parameter(item.Name, item.PropertyType.Name)); } break; }
//这里是查询除字段中属于有公式的,进行解析公式,并将参数添加进去 foreach (var field in fields.Where(x => x.Type == TaskFieldType.expression)) { string expression = field.Properties.Value.GetProperty("expression").ToString(); if (!string.IsNullOrEmpty(expression)) { expressionFun[field.Id] = interpreter.Parse(expression, parameters.ToArray()); } }
下面是将找到所有对象的id,并添加到一个数组当中
var args = new List<object>(); if (expressionFun.Count > 0) { foreach (var field in fields) { args.Add(entity.Fields[field.Id]); } }
最后是进行调用,调用前判断下是否包含这个对象的Id,如果包含就说明有,可以进行调用
if (expressionFun.ContainsKey(field.Id)) { value = expressionFun[field.Id].Invoke(args.ToArray()); }
parameters

浙公网安备 33010602011771号