利用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 -》测试-》 结果 。满足!

原文地址:https://www.cnblogs.com/bninp/p/9012881.html