.Net 中表达式的转换
.Net 中表达式的转换
如: a>0 && (c>a || a <b ) || (a>b || c>1) 转换后 (((a > 0) and ((c > a) OR (a < b))) OR ((a > b) OR (c > 1)))
本文主要用到了 表达式树(Expression Tree) , 表达式树相关知识(https://msdn.microsoft.com/zh-cn/library/system.linq.expressions.expression.aspx)
本实例 只是 抛砖引玉, 不足的地方 大家补充。
还是直接贴代码吧。



private void button1_Click(object sender, EventArgs e)
{ //这里就先写一个吧。
Expression<Func<int, int, int, bool>> m = (a, b, c) => a > && (c > a || a < b) || (a > b || c > ); var cccc = AnalysisExpressionTree(m.Body);
MessageBox.Show("解析后的表达式:" + cccc); //再运行一下
var run = m.Compile(); var result = run(, , ); MessageBox.Show("数据转换成代码运行后的结果:" + result.ToString());
}
/// <summary>
/// 递归解析一下 表达式树
/// </summary>
/// <param name="m"></param>
/// <returns></returns>
private string AnalysisExpressionTree(Expression m)
{
var c = m as ConstantExpression;
if (c != null)
{
return c.Value.ToString();
} var p = m as ParameterExpression; if (p != null)
{ return p.Name;
} var u = m as UnaryExpression; if (u != null)
{ if (u.NodeType == ExpressionType.Not)
{
return "!(" + AnalysisExpressionTree(u.Operand) + ")"; }
} var method = m as MethodCallExpression; if (method != null)
{
return "调用函数" + method.Method.Name + "(" + string.Join(",", method.Method.GetParameters().Select(pp => pp.Name)) + ")"; } var b = m as BinaryExpression; if (b != null)
{ switch (b.NodeType)
{
case ExpressionType.And:
return "(" + AnalysisExpressionTree(b.Left) + " and " + AnalysisExpressionTree(b.Right) + ")"; case ExpressionType.AndAlso:
return "(" + AnalysisExpressionTree(b.Left) + " and " + AnalysisExpressionTree(b.Right) + ")"; case ExpressionType.GreaterThan:
return "(" + AnalysisExpressionTree(b.Left) + " > " + AnalysisExpressionTree(b.Right) + ")"; case ExpressionType.LessThan:
return "(" + AnalysisExpressionTree(b.Left) + " < " + AnalysisExpressionTree(b.Right) + ")"; case ExpressionType.OrElse:
return "(" + AnalysisExpressionTree(b.Left) + " OR " + AnalysisExpressionTree(b.Right) + ")"; case ExpressionType.NotEqual:
return "(" + AnalysisExpressionTree(b.Left) + " != " + AnalysisExpressionTree(b.Right) + ")"; //这里还可以再加 ,此例只是一个 DEMO }
} return ""; }
OK , 就写这些吧。 好久不写博客了。源代码 也发出来吧。
.Net 中表达式的转换的更多相关文章
- 中后缀表达式/洛谷P1175 表达式的转换
P1175 表达式的转换 思路:先用栈转成中缀表达式,再用栈进行计算.要输出过程,因此计算一次输出一次,但是栈没有迭代器,不好用,换成vector(可以pop_back).虽然表达式求值也可以这么做, ...
- c++中的强制转换static_cast、dynamic_cast、reinterpret_cast的不同用法儿
c++中的强制转换static_cast.dynamic_cast.reinterpret_cast的不同用法儿 虽然const_cast是用来去除变量的const限定,但是static_cast ...
- swust oj(0088)表达式的转换
表达式的转换(0088) Time limit(ms): 5000 Memory limit(kb): 65535 Submission: 435 Accepted: 93 Accepted 16级卓 ...
- MYSQL中的日期转换
MYSQL中的日期转换 网址: http://www.eygle.com/digest/2006/09/mysql_date_convert.html 对于每个类型拥有的值范围以及并且指定日期何时间值 ...
- Python与数据结构[1] -> 栈/Stack[1] -> 中缀表达式与后缀表达式的转换和计算
中缀表达式与后缀表达式的转换和计算 目录 中缀表达式转换为后缀表达式 后缀表达式的计算 1 中缀表达式转换为后缀表达式 中缀表达式转换为后缀表达式的实现方式为: 依次获取中缀表达式的元素, 若元素为操 ...
- 洛谷P1175 表达式的转换
P1175 表达式的转换 44通过 147提交 题目提供者该用户不存在 标签云端 难度提高+/省选- 时空限制1s / 128MB 提交 讨论 题解 最新讨论更多讨论 这题有毒 抄题解棒责五十! ...
- JavaScript 中表达式和语句的区别
1.语句和表达式 JavaScript中的表达式和语句是有区别的.一个表达式会产生一个值,它可以放在任何需要一个值的地方,比如,作为一个函数调用的参数.下面的每行代码都是一个表达式: myvar3 + ...
- LINQ查询表达式详解(2)——查询表达式的转换
简介 C#在执行LINQ查询表达式的时候,并不会指定其执行语义,而是将查询表达式转换为遵循查询表达式模式的方法的调用.具体而言,查询表达式将转换为以下名称的调用:Where.Select.Select ...
- java中数据类型的转换
数据类型的转换,分为自动转换和强制转换. 自动转换是程序执行过程中“悄然”进行的转换,不需要用户提前声明,一般是从位数低的类型向位数高的类型转换 强制转换必须在代码中声明,转换顺序不受限制 自动数据类 ...
随机推荐
- WebOb的简单介绍
在之前的文章中我写了有关于如何使用PasteDeploy生成WSGI的Application.在Openstack的源码中,除了 PasteDeploy外,还有一个和WSGI密切相关的工具包WebOb ...
- ubuntu启用root用户
在安装Ubuntu时系统会提示你创建一个用户,但是该用户不具备ROOT权限.但是此时系统是有root用户的,root密码是随机的,如果你想使用root用户需要更改root密码.用你安装系统时创建的用户 ...
- Spring MVC返回JSON数据
将一个对象以json数据格式返回前台: @ResponseBody public User login(User user) { return user; } 在控制器上使用@ResponseBod ...
- SQL2008-显示表大小行数
select object_name(id) tablename,8*reserved/1024 reserved,rtrim(8*dpages/1024)+'Mb' used,8*(reserved ...
- 浅谈iOS中MVVM的架构设计与团队协作
说到架构设计和团队协作,这个对App的开发还是比较重要的.即使作为一个专业的搬砖者,前提是你这砖搬完放在哪?不只是Code有框架,其他的东西都是有框架的,比如桥梁等等神马的~在这儿就不往外扯了.一个好 ...
- SHH入门:Spring框架简介
(1)Spring 七大模块 核心容器:核心容器提供Spring 框架的基本功能.核心容器的主要组件是 BeanFactory,它是工厂模式的实现.BeanFactory 使用控制反转 (IOC) 模 ...
- 【Stage3D学习笔记续】山寨Starling(九):上下文丢失处理方法
Stage3D在运行中是存在随时会丢失上下文的尴尬情况. 渲染内容丢失的问题本身就说明是因为丢失了Context3D对象.出现此问题的原因很多,通常还不是因为Stage3D应用.比如在win7系统中, ...
- ASP.NET 学习的总结
应用程序域 使用.Net建立的可执行程序*.exe,并没有直接承载到进程当中,而是承载到应用程序域(AppDomain)当中.应用程序域是.Net引入的一个新概念,它比进程所占用的资源要少,可以被看做 ...
- vertical-align:top在单词和中文的表现
<ul> <li> <img src="../../saasdist_v2/images/staff-img.png" alt="" ...
- Cocos2d-x——CocosBuilder官方帮助文档翻译1 使用自定义类
原创:请注明转载! 在Cocos2d-x中使用CocosBuilder 使用自定义类 CocosBuilder的使用方法是通过自定义类.在CocosBuilder中选中一个对象并在属性栏中输入自定义类 ...