轉載: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組件還低些,具體實現方法待找到當時的測試用例再補上。