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


    前序:

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

                    

     

     

      

  • 相关阅读:
    JAVA-throw new IOException报错unhandled exception:java.lang.Exception 2021年6月7日
    GIt保持远程 源仓库与Fork仓库同步--2017年6月13日
    Python的getattr()-2017年6月7日
    JavaScript学习-2017年5月18日
    Writing your first Django app--2017年5月9日
    M4-AC6 Oh,Trojan Again--2017年5月9日
    吴军硅谷来信
    【1】Prologue--A Game of Thrones--2017年4月8日
    M4-PC9 Read 10,000 Books,Travel 10,000 Miles--2017年5月8日
    资源分配图RAG的化简
  • 原文地址:https://www.cnblogs.com/qingse/p/3187153.html
Copyright © 2020-2023  润新知