需求是将一个string 表达式 转换成 逻辑 表达式 并得到结果。

例如: bool result = (key1==val1) || (key2!=val2) && (key3==val3). 其中 keyN, valN 均为变量。

基本的思路是先做Express string 验证,然后进行解析。

验证可以用正则表达式。

解析最基本的方法是用 表达式树 (Express Tree).  PostFix.

C# linq 提供了一个解决方案就是 Linq 语法树。

https://www.codeproject.com/Articles/74018/How-to-Parse-and-Convert-a-Delegate-into-an-Expre

目前较好的方法是用Microsoft 的  Dynamic Linq (http://msdn.microsoft.com/en-us/vcsharp/bb894665.aspx)

static void Main(string[] args)
{
string[] exps = new string[]
{
@" ""keyA"" !=""valA"" ",
@"keyA !=""valA""",
@"(keyA ==""valA"")",
@"keyA ==""val1"" || key2 ==""val2""",
@"key1 ==""val1"" && key2 ==""val2""",
@" key1 !=""val1"" || key2 ==""val2""&& key3 != ""val3""",
@"(key1 ==""val1"" || key2 ==""val2"")&& key3 != ""val3""",
}; string pattern = @"(?<key>[\w\d_]+)""*\s*(?<equality>==|!=)\s*""*(?<value>[\w\d_]+)"; foreach (var exp in exps)
{
// Parses to get the parameters.
string formattedExp = exp;
var matches = Regex.Matches(exp, pattern);
ParameterExpression[] parameters = new ParameterExpression[matches.Count];
for (int i =; i < matches.Count; i++)
{
Debug.Write(" key[" + matches[i].Groups["key"].Value);
Debug.Write("] equality[" + matches[i].Groups["equality"].Value);
Debug.Write("] value[" + matches[i].Groups["value"].Value +"]\t\n"); parameters[i] = Expression.Parameter(typeof(string), matches[i].Groups["key"].Value); // Removing " if it has in keys.
if (exp.Contains(string.Format(@"""{0}""", matches[i].Groups["key"].Value)))
{
formattedExp = exp.Replace(string.Format(@"""{0}""", matches[i].Groups["key"].Value), matches[i].Groups["key"].Value);
}
} var e = System.Linq.Dynamic.DynamicExpression.ParseLambda(parameters, null, formattedExp); string[] GotValues = new string[matches.Count];
if (GotValues.Length == )
{
GotValues[] = "val1";
GotValues[] = "val2";
} if (GotValues.Length == )
{
GotValues[] = "val1";
GotValues[] = "val2";
GotValues[] = "val3";
} var result = e.Compile().DynamicInvoke(GotValues); Debug.WriteLine("{0} ---> {1}", e.ToString(), result);
}
}

输出如下:

keyA => (keyA != "valA") ---> True
 key[keyA] equality[!=] value[valA] 
keyA => (keyA != "valA") ---> True
 key[keyA] equality[==] value[valA] 
keyA => (keyA == "valA") ---> False
 key[keyA] equality[==] value[val1] 
 key[key2] equality[==] value[val2] 
(keyA, key2) => ((keyA == "val1") OrElse (key2 == "val2")) ---> True
 key[key1] equality[==] value[val1] 
 key[key2] equality[==] value[val2] 
(key1, key2) => ((key1 == "val1") AndAlso (key2 == "val2")) ---> True
 key[key1] equality[!=] value[val1] 
 key[key2] equality[==] value[val2] 
 key[key3] equality[!=] value[val3] 
(key1, key2, key3) => ((key1 != "val1") OrElse ((key2 == "val2") AndAlso (key3 != "val3"))) ---> False
 key[key1] equality[==] value[val1] 
 key[key2] equality[==] value[val2] 
 key[key3] equality[!=] value[val3] 
(key1, key2, key3) => (((key1 == "val1") OrElse (key2 == "val2")) AndAlso (key3 != "val3")) ---> False

参考:

https://stackoverflow.com/questions/821365/how-to-convert-a-string-to-its-equivalent-linq-expression-tree

最新文章

  1. mybatis 如何使用乐观锁
  2. java学习第17天(TreeSet HashSet)
  3. Sql server脏读、更新丢失、不可重复读、幻象读问题及解决方案
  4. Eclipse中调试技巧
  5. Delphi异形窗口之PNG
  6. BZOJ 2535 Plane 航空管制2
  7. JavaScript 使用Document记录cookie
  8. Python3.2官方文件翻译--课堂笔记和异常是阶级
  9. 苹果页面启动icon大小(57*57 114*114)
  10. 信息存储——当值X是2的非负整数n次幂时,如何表示成十六进制
  11. DEV TdxLayoutGroup设置tab
  12. Entity Framework 6.x Code First 基础
  13. Backdoor CTF 2013: 电子取证 250
  14. qemu创建vm和vcpu进入kvm的流程
  15. MongoDB日期类型查询
  16. Java并发编程之ThreadGroup
  17. python入门科普IDE工具和编译环境
  18. Gradle Goodness: Group Similar Tasks
  19. Linux字符设备驱动--No.2
  20. STL 堆的使用

热门文章

  1. ModuleNotFoundError: No module named &#39;Crypto&#39;
  2. python lambda匿名函数 用法
  3. python学习,day1作业:设计一个三级菜单
  4. [转] Jenkins pipeline 踩坑集合
  5. Servlet入门小案例
  6. APP开发的三种技术对比
  7. ionic3 pop到指定页面
  8. crypto-js计算文件的sha256值
  9. linux install tomcat
  10. Mybatis的输入映射和输出映射