C#實現將字符串作為表達式運算


轉載:http://blog.csdn.net/lifeforcode/article/details/2010807

 

 曾經有個需求,要把一段字符串作為C#的一段語句來執行。說實在了,就類似實現計算器的功能,把用戶輸入的數據作為運算式來執行,當時的需求當然不這么簡單,不過在解決思路上沒 區別。
       隊友們提出了幾個方案,第一個方案是強技術型的:把這個字符串解析成波蘭式,再把這個波蘭式壓入隊列中逐步處理。第二個方案是強工具型的:利用數據庫的運算功能,把這個字符串組成Sql交給數據庫運算。最后我報個折中的想法:依舊要利用編程語言實現,不過要利用內建類庫。
       一開始看到上面需求,熟悉JavaScript的朋友就會想到Eval這個強大的方法了。當時我是也如此想,可是有大量的邏輯處理要在伺服端運行,最后的思路就是想辦法讓C#實現Eval方法。當時找到了幾種方法,最后使用了下面
一種:

private object EvalExpress(string sExpression)
        {
            Microsoft.JScript.Vsa.VsaEngine ve = Microsoft.JScript.Vsa.VsaEngine.CreateEngine();
            return Microsoft.JScript.Eval.JScriptEvaluate(sExpression, ve);
        }

       EvalExpress這個方法便可以將sExpression作為表達式執行,運行結果返回是object,但是根據參數內容不同,可以轉換成bool、int、string等。
       不過既然是使用腳本引擎來執行的,速度不會太好。而且這兩個組件在VS05中提示已過時,但是在提示信息和MSDN中沒找到替代方案。

       另外還有兩種方法:引用Com組件來使用腳本引擎和引用CodeDom動態編譯,不過這兩種性能比用.Net組件還低些,具體實現方法待找到當時的測試用例再補上。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM