如何在C#里面象js一樣可以直接計算字符串的值
2024-07-21 02:19:10
供稿:網友
今天在論壇里面逛發現一個問題比較典型,我們在使用js的時候可以直接使用eval得到某一個表達式的值,在c#里面可以嗎?答案是肯定的,在.net提供的豐富的類庫里面這是可以實現的,但是沒有js那么簡單下面我將使用一個簡單的例子來說明利用編譯器和反射得到一個字符串表達式的值。我們建立一個windows窗體里面有如下的方法:
引用一下命名空間:
using system;
using system.text;
using system.codedom.compiler;
using system.reflection;
using system.io;
using microsoft.csharp;
命名空間的具體意義就不說了,下面看看代碼,為了可以讓我們的工程可以重復使用我們新建一個類庫工程名叫:coustomeval其中有一個類是用來計算某一斷字符串的值。詳細代碼如下所示:
namespace coustomeval{
///
/// summary description for class1.
///
public class myeval{
public myeval(){
//
// todo: add constructor logic here
//
}
public object eval(string ccharpcode){
csharpcodeprovider csharpcodeprovider = new csharpcodeprovider();
icodecompiler compiler = csharpcodeprovider.createcompiler();
compilerparameters cp = new compilerparameters();
cp.referencedassemblies.add("system.dll");
cp.compileroptions = "/t:library";
cp.generateinmemory = true;
stringbuilder mycode = new stringbuilder();
mycode.append("using system;");
mycode.append("namespace coustomeval{");
mycode.append("class mylib {private "+ccharpcode+" public int mymethod(){return i;}}");
mycode.append("}");
compilerresults cr = compiler.compileassemblyfromsource(cp,mycode.tostring());
assembly assembly = cr.compiledassembly;
object tmp = assembly.createinstance("coustomeval.mylib");
type type = tmp.gettype();
methodinfo mi = type.getmethod("mymethod");
object result = mi.invoke(tmp,null);
return result;
}
}
}
上面的類庫只具有一般代表性不具備一般使用性,重要的是提供一種方法來實現它,所以我在里面使用了硬編碼的方式,如果你喜歡可以使用其他的方式,包括讀文件,讀數據庫取得代碼段等等。然后我們在建立一個測試工程,該工程里面有一個測試窗體,該窗體上有一個按鈕和兩個文本框,其中一個文文本框用來輸入要計算的值,另一個顯示計算的結果,詳細代碼如下:
private void button1_click(object sender, system.eventargs e) {
myeval eval = new myeval();
object result = eval.eval(this.textbox1.text);
this.textbox2.text = result.tostring();
}
在這個工程中需要引用上面的工程,這樣我們就可以使用myeval類來實現計算textbox1里面的值了,最后可以將值顯示在textbox2里面,代碼運行的結果我在這里就不帖了。只給出我的測試結果,由于該問題源于論壇所以我就是用論壇中原來的測試要求。
測試結果:在textbox中輸入int i = 10;點擊button1以后將會在textbox2中顯示出10。