• 利用CodeDom 动态执行条件表达式


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

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

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

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

        百度了一圈关键字之后:

    https://blog.csdn.net/lee576/article/details/19557009

       根据实际情况选用了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;
    ");
                sb.Append("namespace CSCodeEvaler{ 
    ");
                sb.Append("public class CSCodeEvaler{ 
    ");
                sb.Append("public object EvalCode(){
    ");
                sb.Append(bianliang);
                sb.Append("return " + sCSCode + "; 
    ");
                sb.Append("} 
    ");
                sb.Append("} 
    ");
                sb.Append("}
    ");
    
                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;
     int Type=1;");
                Console.WriteLine(result);
                var result2 = Util.Eval("(Amount>500||Type==1)&&Amount<50000&&Amount!=38888", "int Amount=38888;
     int Type=2;");
                Console.WriteLine(result2);
                Console.ReadKey();
            }

    image

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

  • 相关阅读:
    解决问题通用方法论
    Flutter 即学即用系列博客总结篇
    Android Q 兼容那些事
    Android 截屏的各种骚操作
    MTLTexture转成UIimage
    swift使用metal加载三角形、平面图片、立体图像
    GPUImage2的使用
    Swift OpenGL ES 自定义常用滤镜(二)
    Swift OpenGL ES 自定义常用滤镜(一)
    Core Image简介与使用
  • 原文地址:https://www.cnblogs.com/bninp/p/9012881.html
Copyright © 2020-2023  润新知