因為在我的某個工具包裡需要能動態執行一段代碼進行求值的功能,也就是類似於JAVA SCRIPT裡的Eval函數和VB SCRIPT的Execute函數功能,但C#與VB.NET卻沒有類似的函數:( 只能手動編寫。上網搜尋了一下,幸運的從一個英文網站找到了:)代碼量很少,它是通過調用JScript.NET裡的Eval函數進行處理的,下面是代碼(部分代碼我修改與刪減過,並非完整的原代碼,在此感謝原作者scott):
using System;
using System.CodeDom.Compiler;
using System.Reflection;
/**//// <summary>
/// 動態求值
/// </summary>
public class Evaluator
{
/**//// <summary>
/// 計算結果,如果運算式出錯則拋出異常
/// </summary>
/// <param name="statement">運算式,如"1+2+3+4"</param>
/// <returns>結果</returns>
public static object Eval(string statement)
{
return _evaluatorType.InvokeMember(
"Eval",
BindingFlags.InvokeMethod,
null,
_evaluator,
new object[] { statement }
);
}
/**//// <summary>
///
/// </summary>
static Evaluator()
{
//構造JScript的編譯驅動代碼
CodeDomProvider provider = CodeDomProvider.CreateProvider("JScript");
CompilerParameters parameters;
parameters = new CompilerParameters();
parameters.GenerateInMemory = true;
CompilerResults results;
results = provider.CompileAssemblyFromSource(parameters, _jscriptSource);
Assembly assembly = results.CompiledAssembly;
_evaluatorType = assembly.GetType("Evaluator");
_evaluator = Activator.CreateInstance(_evaluatorType);
}
private static object _evaluator = null;
private static Type _evaluatorType = null;
/**//// <summary>
/// JScript代碼
/// </summary>
private static readonly string _jscriptSource =
@"class Evaluator
{
public function Eval(expr : String) : String
{
return eval(expr);
}
}";
}