字符串表达式解析方法小结
前序:
背景: 最近在做个无聊的事:把一堆byte[] 流解析成 实体类。
无聊,繁琐。想了想,还是用配置文件+反射来做,什么效率的去死吧,我不想加班!
做法:每个byte[] 流对应一个类。那么配置文件要做的就是需要配置:类的每个属性对应byte[]的哪几位
问题:遇到某个属性在 byte[]中的长度及位置是由其本身的一个、或者几个属性的值的运算结果决定的。
想法:lambda表达式,或者嵌入脚本。只要在配置文件中某个节点有类似 Expression="b+c" 的效果不就好了。
方法汇总:1、lambda表达式:
共享一个从字符串转 Lambda 表达式的类(6) - Lenic - 博客园
http://www.cnblogs.com/lenic/archive/2012/07/25/2607879.html#2724461
LambdaParser:解析代码字符串为Lambda表达式并编译为委托 - 朱才 - 博客园
http://www.cnblogs.com/zhucai/archive/2009/06/10/LambdaParser_Lambda_Expression_Parser.html
有如上两篇牛人写的文章,我很是花了点精力学习,非常开拓思路。但有个小问题,在处理 Convert.ToInt32(j.a + j.b - 1)
这类有 Convert.ToInt32 函数的字符串就悲剧了。我无法验证其稳定性!
2、表达式解析引擎:
如:Antlr、flee 有链接如下:http://www.cnblogs.com/luoyifan/archive/2010/10/14/1851254.html
因为项目客户的原因,没有选择。
3、嵌入脚本:
嵌入脚本不外乎 lua, Ruby, Python 等。搜索了一下,都是Iron系列,如 IronPython。
使用也不是很麻烦,但都是一些开源或半开源项目。因为目前这个项目的客户原因,想引入这些项目有点困难。
4、javascript:
ok,就是他了。在摸索过程中,想起做web项目的时候,后台不就可以运行javascript!
贴个其中一个连接 http://www.cnblogs.com/flappy/archive/2006/05/14/399803.html。
参考了诸多方案,意见后,最终我的做法如下。
最终做法: 1、在vs com项引入 Microsoft Script Control 1.0
2、在vs2010中可能会遇到个问题: http://www.cnblogs.com/pnljs/archive/2012/02/20/2359313.html
解决方法:把 “Microsoft Script Control 1.0” 的属性“嵌入互操作类型”设为 false。
3、 代码:
public class TestClass { public TestClass(int _a, int _b) { a = _a; b = _b; } public int a; public int b; public int c; } public string Execute(string _expression, object _obj, string[] _strArray) { string[] t_paramters = null; if (_strArray.Length > 0) t_paramters = new string[_strArray.Length]; for (int i = 0; i < _strArray.Length; i++) { t_paramters[i] = _obj.GetType().GetField(_strArray[i]).GetValue(_obj).ToString(); } MSScriptControl.ScriptControlClass sc = new MSScriptControl.ScriptControlClass(); sc.Language = "javascript"; object res = sc.Eval(string.Format(_expression, t_paramters)); return res.ToString(); } private void button5_Click(object sender, EventArgs e) { string t_expression = "{0}+{1}"; TestClass t_tc = new TestClass(1, 2); string[] t_strArray = new string[] { "a", "b" }; t_tc.c = int.Parse(Execute(t_expression, t_tc, t_strArray)); }
4、注意下表达式和语句的区别。
over。
ps:排版的什么的去死吧,出去运动了!