zoukankan      html  css  js  c++  java
  • 字符串表达式解析方法小结

    前序:

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

                    

     

     

      

  • 相关阅读:
    Leetcode总结之Tree
    Leetcode总结之DFS
    Leetcode总结之Backtracking
    策略模式(设计模式_02)
    面向对象思想设计_计算器小程序(设计模式入门篇_01)
    Android GridView 滑动条设置一直显示状态
    dp暑假专题 训练记录
    dp入门 专题记录 2017-7-26
    dp问题 -挑战例题 2017-7-24
    贪心思维 专题记录 2017-7-21
  • 原文地址:https://www.cnblogs.com/qingse/p/3187153.html
Copyright © 2011-2022 走看看