博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用CodeDom 动态执行条件表达式
阅读量:5262 次
发布时间:2019-06-14

本文共 2216 字,大约阅读时间需要 7 分钟。

   在实际需求遇到需要根据不同条件,去指定不同的不同的审批人。起初的需求倒很简单,明确是当金额 >=500000 , 可变的就是500000这个数额。

当时为了防止可能产生的变化。特意搞了 条件 和金额这两个变量。但是只能满足单向的条件判断:=  != >=  <=  >  < 这几种。

   需求是个唯变不变的东西。当条件变成 Amout>1000&&Amout<500000  开始有金额区间 的时候现有的方案满足不了。当然如果只是这种定式的还可以针对这种自己分解判断。  但是有点害怕终究有一天会变成(Amount>500||Type==1)&&Amount<50000&&Amount!=38888.

   所以,需要一个万全之策:

    百度了一圈关键字之后:

   根据实际情况选用了CodeDom的方式,我这一块对性能没有太大的要求。原则上来说只要我的条件表达式满足c#的条件判断语法。就都能满足!Ok,很强大。

public class Util    {        public static object Eval(string sCSCode, string bianliang)        {            CodeDomProvider pro = new CSharpCodeProvider();            CompilerParameters cp = new CompilerParameters();            cp.ReferencedAssemblies.Add("system.dll");             cp.CompilerOptions = "/t:library";            cp.GenerateInMemory = true;            StringBuilder sb = new StringBuilder("");            sb.Append("using System;\n");            sb.Append("namespace CSCodeEvaler{ \n");            sb.Append("public class CSCodeEvaler{ \n");            sb.Append("public object EvalCode(){\n");            sb.Append(bianliang);            sb.Append("return " + sCSCode + "; \n");            sb.Append("} \n");            sb.Append("} \n");            sb.Append("}\n");            CompilerResults cr = pro.CompileAssemblyFromSource(cp, sb.ToString());            if (cr.Errors.Count > 0)            {                Console.WriteLine("ERROR: " + cr.Errors[0].ErrorText);                                return null;            }            System.Reflection.Assembly a = cr.CompiledAssembly;            object o = a.CreateInstance("CSCodeEvaler.CSCodeEvaler");            Type t = o.GetType();            MethodInfo mi = t.GetMethod("EvalCode");            object s = mi.Invoke(o, null);            return s;        }    }
static void Main(string[] args)        {            var result = Util.Eval("(Amount>500||Type==1)&&Amount<50000&&Amount!=38888", "int Amount=400;\n int Type=1;");            Console.WriteLine(result);            var result2 = Util.Eval("(Amount>500||Type==1)&&Amount<50000&&Amount!=38888", "int Amount=38888;\n int Type=2;");            Console.WriteLine(result2);            Console.ReadKey();        }

一套demo 三连:demo -》测试-》 结果 。满足!

转载于:https://www.cnblogs.com/bninp/p/9012881.html

你可能感兴趣的文章
简述spring中常有的几种advice?
查看>>
整理推荐的CSS属性书写顺序
查看>>
ServerSocket和Socket通信
查看>>
css & input type & search icon
查看>>
源代码的下载和编译读后感
查看>>
Kafka学习笔记
查看>>
Octotree Chrome安装与使用方法
查看>>
Windows 环境下基于 Redis 的 Celery 任务调度模块的实现
查看>>
趣谈Java变量的可见性问题
查看>>
C# 强制关闭当前程序进程(完全Kill掉不留痕迹)
查看>>
ssm框架之将数据库的数据导入导出为excel文件
查看>>
语音识别中的MFCC的提取原理和MATLAB实现
查看>>
验证组件FluentValidation的使用示例
查看>>
0320-学习进度条
查看>>
解决windows系统的oracle数据库不能启动ora-00119和ora-00130的问题
查看>>
ip相关问题解答
查看>>
MetaWeblog API Test
查看>>
反弹SHELL
查看>>
关闭Chrome浏览器的自动更新和升级提示
查看>>
移动、尺寸改变
查看>>