方法一: 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

  

 

posted on 2013-05-04 18:11  StephenLee  阅读(162)  评论(0)    收藏  举报