完成公式属性的基本能力>后台规则解析

这个功能是通过解析公式字段的字符串内容进行解析,在后台做出相应的逻辑,比如说字符传内容是“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
posted @ 2022-05-13 22:04  咳咳Pro  阅读(111)  评论(0)    收藏  举报