在实际需求遇到需要根据不同条件,去指定不同的不同的审批人。起初的需求倒很简单,明确是当金额 >=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,很强大。

  1. public class Util
  2. {
  3.  
  4. public static object Eval(string sCSCode, string bianliang)
  5. {
  6.  
  7. CodeDomProvider pro = new CSharpCodeProvider();
  8.  
  9. CompilerParameters cp = new CompilerParameters();
  10.  
  11. cp.ReferencedAssemblies.Add("system.dll");
  12.  
  13. cp.CompilerOptions = "/t:library";
  14. cp.GenerateInMemory = true;
  15.  
  16. StringBuilder sb = new StringBuilder("");
  17. sb.Append("using System;\n");
  18. sb.Append("namespace CSCodeEvaler{ \n");
  19. sb.Append("public class CSCodeEvaler{ \n");
  20. sb.Append("public object EvalCode(){\n");
  21. sb.Append(bianliang);
  22. sb.Append("return " + sCSCode + "; \n");
  23. sb.Append("} \n");
  24. sb.Append("} \n");
  25. sb.Append("}\n");
  26.  
  27. CompilerResults cr = pro.CompileAssemblyFromSource(cp, sb.ToString());
  28. if (cr.Errors.Count > 0)
  29. {
  30. Console.WriteLine("ERROR: " + cr.Errors[0].ErrorText);
  31.  
  32. return null;
  33. }
  34.  
  35. System.Reflection.Assembly a = cr.CompiledAssembly;
  36. object o = a.CreateInstance("CSCodeEvaler.CSCodeEvaler");
  37.  
  38. Type t = o.GetType();
  39. MethodInfo mi = t.GetMethod("EvalCode");
  40.  
  41. object s = mi.Invoke(o, null);
  42. return s;
  43.  
  44. }
  45. }
  1. static void Main(string[] args)
  2. {
  3. var result = Util.Eval("(Amount>500||Type==1)&&Amount<50000&&Amount!=38888", "int Amount=400;\n int Type=1;");
  4. Console.WriteLine(result);
  5. var result2 = Util.Eval("(Amount>500||Type==1)&&Amount<50000&&Amount!=38888", "int Amount=38888;\n int Type=2;");
  6. Console.WriteLine(result2);
  7. Console.ReadKey();
  8. }

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

利用CodeDom 动态执行条件表达式的更多相关文章

  1. 【Linux_Shell 脚本编程学习笔记一、条件表达式】

    条件表达式返回的结果都为布尔型 真为1,假为0 条件测试的表达式 [expression] 比较符 整数比较 -eq:比较两个整数是否相等,$A -eq $B -ne:测试两个整数是否不等,不等则为真 ...

  2. 【转】EntityFramework动态组合Lambda表达式作为数据筛选条件,代替拼接SQL语句

    传统的操作数据库方式,筛选数据需要用StringBuilder拼接一大堆的WHERE子句. 在Entity Framework中,代码稍有不慎就会造成巨大性能消耗,如: using(var db=ne ...

  3. EntityFramework动态多条件查询与Lambda表达式树

              在常规的信息系统中, 我们有需要动态多条件查询的情况, 例如UI上有多个选择项可供用户选择多条件查询数据. 那么在.net平台Entity Framework下, 我们用Lambd ...

  4. 第二百八十七节,MySQL数据库-条件语句、循环语句、动态执行SQL语句

    MySQL数据库-条件语句.循环语句.动态执行SQL语句 1.if条件语句 delimiter \\ CREATE PROCEDURE proc_if () BEGIN ; THEN ; ELSEIF ...

  5. Asp.net Core C#进行筛选、过滤、使用PredicateBuilder进行动态拼接lamdba表达式树并用作条件精准查询,模糊查询

    在asp.net core.asp.net 中做where条件过滤筛选的时候写的长而繁琐不利于维护,用PredicateBuilder进行筛选.过滤.LInq配合Ef.core进行动态拼接lamdba ...

  6. C#动态执行字符串(动态创建代码)

    在编写C#程序的时候,有时我们需要动态生成一些代码并执行.然而C#不像JavaScript有一个Eval函数,可以动态的执行代码.所有这些功能都要我们自己去完成.如下是实例. 动态创建代码: usin ...

  7. 动态执行C#代码

    using System; using System.CodeDom.Compiler;using System.Collections.Generic;using System.Linq;using ...

  8. .Net拾忆:CodeDom动态源代码生成器和编译器

    代码文档模型CodeDom命名空间下主要有两个,很明显第一个代码逻辑分析,第二个负责代码的编译 using System.CodeDom; using System.CodeDom.Compiler; ...

  9. Shell条件表达式

    Shell编程中经常需要判断文件状态.字符串是否相等以及两个数值大小等情况,基于这些比较结果再做执行相关操作.本文主要讲述文件状态.字符串.数值大小的判断比较方法. 文件状态判断 文件状态的判断通常使 ...

随机推荐

  1. 谦先生-hadoop大数据运维纪实

    1.NN宕掉切不过去先看zkfc的log引起原因是dfs.ha.fencing.ssh.private-key-files的配置路径配错造成以致无法找到公钥 2.dfs.namenode.shared ...

  2. Javascript高级编程学习笔记(27)—— BOM(1)window对象1

    ECMAScript是JS的核心 但是对于在浏览器中运行的JS,BOM显然才是真正的核心 我们知道JS是由三个部分组成的 BOM.DOM.ECMAScript 之前的文章我们主要介绍的是ECMAScr ...

  3. 吴恩达机器学习笔记25-神经网络的模型表示2(Model Representation of Neural Network II)

    ( FORWARD PROPAGATION ) 相对于使用循环来编码,利用向量化的方法会使得计算更为简便.以上面的神经网络为例,试着计算第二层的值: 这只是针对训练集中一个训练实例所进行的计算.如果我 ...

  4. MySQL分布式事物(XA事物)的使用

    有时一个系统的数据 放在不同的库之中.如果用普通的事物 一个分支库提交成功了,另外一个分支库提交失败了, 这候 两个库没有同步的成功或者失败.会导致系统数据的不完整. 对于处理这种情况 MySQL有了 ...

  5. php--isset()、is_null() 、empty()

    开发中经常会遇到验证某个参数是否是null或者是否为空. 一.isset().is_null() .empty() : isset():检测变量是否设置,并且不是 NULL.如果变量没有赋值 或者 变 ...

  6. 机器学习入门09 - 特征组合 (Feature Crosses)

    原文链接:https://developers.google.com/machine-learning/crash-course/feature-crosses/ 特征组合是指两个或多个特征相乘形成的 ...

  7. Tools - 负载性能测试工具JMeter

    JMeter简介 HomePage:http://jmeter.apache.org/ Apache JMeter是Apache组织开发的基于Java的开源负载性能测试工具. 可以用于对服务器.网络应 ...

  8. Python档案袋( 时间 和 随机数 模块 )

    时间模块 #导入必要模块 import time #获取时间戳 print(time.time()) #输出:1547651016.03502 #格式化时间元组 # 参数可传递自定义的时间戳,如:ti ...

  9. iOS学习——(转)UIResponder详解

    本文转载自:ios开发 之 UIResponder详解 我们知道UIResponder是所有视图View的基类,在iOS中UIResponder类是专门用来响应用户的操作处理各种事件的,包括触摸事件( ...

  10. [原创]K8飞刀Final

    法律声明: 工具仅供安全研究或授权渗透,非法用途后果自负. 工具: K8飞刀Final作者: K8哥哥博客: https://www.cnblogs.com/k8gege简介: 一款多功能网络安全渗透 ...