方法一: MSScriptControl.ScriptControl
var exp = "3 + (2 + 3)/5"; var type = Type.GetTypeFromProgID("MSScriptControl.ScriptControl"); var obj = Activator.CreateInstance(type); type.InvokeMember("Language", BindingFlags.SetProperty, null, obj, new object[] { "javascript" }); var result = type.InvokeMember("Eval", BindingFlags.InvokeMethod, null, obj, new object[] { exp }); Console.WriteLine("{0} = {1}", exp, result);
方法二:CodeDOM
var exp = "3 + (2 + 3)/5"; var csCodeProvider = new CSharpCodeProvider(); var csParams = new CompilerParameters(); var source = "public class MainClass { public static object Eval() { return (#exp#); } }"; source = source.Replace("#exp#", exp); csParams.CompilerOptions = "/t:library"; csParams.GenerateInMemory = true; var csResults = csCodeProvider. CompileAssemblyFromSource(csParams, source); if (csResults.Errors.Count > 0) { Console.WriteLine(csResults.Errors[0].ToString()); return; } var ass = csResults.CompiledAssembly; var type = ass.GetType("MainClass"); var result = type.InvokeMember("Eval", BindingFlags.InvokeMethod, null, null, null); Console.WriteLine("{0} = {1}", exp, result);
方法三:DataColumn.Expression
var exp = "3 + (2 + 3)/5"; DataTable dt = new DataTable(); dt.Columns.Add("Result").Expression = exp; dt.Rows.Add(dt.NewRow()); var result = dt.Rows[0]["Result"]; Console.WriteLine("{0} = {1}", exp, result);
就运算效率来讲,个人推荐使用方法三,因其他两种方法都需要用反射调用,故在效率上同时也就大打折扣,可根据不同情况需求选择。
转自:http://blog.csdn.net/fangxinggood/article/details/5992661
浙公网安备 33010602011771号