字符串表达式解析方法小结

前序:

          背景: 最近在做个无聊的事:把一堆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:排版的什么的去死吧,出去运动了!

                

 

 

  

原文地址:https://www.cnblogs.com/qingse/p/3187153.html