代碼:
using System;
using System.CodeDom.Compiler;
using System.Reflection;
using System.Text;
using Microsoft.CSharp;
namespace Expression
{
/// <summary>
/// 計算表達式的類
/// </summary>
public class CalculateExpression
{
/// <summary>
/// 接受一個string類型的表達式並計算結果,返回一個object對象,靜態方法
/// </summary>
/// <param name="expression"></param>
/// <returns></returns>
public static object Calculate( string expression)
{
string className = " Calc ";
string methodName = " Run ";
expression = expression.Replace( " / ", " *1.0/ ");
// 設置編譯參數
CompilerParameters paras = new CompilerParameters();
paras.GenerateExecutable = false;
paras.GenerateInMemory = true;
// 創建動態代碼
StringBuilder classSource = new StringBuilder();
classSource.Append( " public class " + className + " \n ");
classSource.Append( " {\n ");
classSource.Append( " public object " + methodName + " ()\n ");
classSource.Append( " {\n ");
classSource.Append( " return " + expression + " ;\n ");
classSource.Append( " }\n ");
classSource.Append( " } ");
// 編譯代碼
CompilerResults result = new CSharpCodeProvider().CompileAssemblyFromSource(paras, classSource.ToString());
// 獲取編譯后的程序集。
Assembly assembly = result.CompiledAssembly;
// 動態調用方法。
object eval = assembly.CreateInstance(className);
MethodInfo method = eval.GetType().GetMethod(methodName);
object reobj = method.Invoke(eval, null);
GC.Collect();
return reobj;
}
}
}
using System.CodeDom.Compiler;
using System.Reflection;
using System.Text;
using Microsoft.CSharp;
namespace Expression
{
/// <summary>
/// 計算表達式的類
/// </summary>
public class CalculateExpression
{
/// <summary>
/// 接受一個string類型的表達式並計算結果,返回一個object對象,靜態方法
/// </summary>
/// <param name="expression"></param>
/// <returns></returns>
public static object Calculate( string expression)
{
string className = " Calc ";
string methodName = " Run ";
expression = expression.Replace( " / ", " *1.0/ ");
// 設置編譯參數
CompilerParameters paras = new CompilerParameters();
paras.GenerateExecutable = false;
paras.GenerateInMemory = true;
// 創建動態代碼
StringBuilder classSource = new StringBuilder();
classSource.Append( " public class " + className + " \n ");
classSource.Append( " {\n ");
classSource.Append( " public object " + methodName + " ()\n ");
classSource.Append( " {\n ");
classSource.Append( " return " + expression + " ;\n ");
classSource.Append( " }\n ");
classSource.Append( " } ");
// 編譯代碼
CompilerResults result = new CSharpCodeProvider().CompileAssemblyFromSource(paras, classSource.ToString());
// 獲取編譯后的程序集。
Assembly assembly = result.CompiledAssembly;
// 動態調用方法。
object eval = assembly.CreateInstance(className);
MethodInfo method = eval.GetType().GetMethod(methodName);
object reobj = method.Invoke(eval, null);
GC.Collect();
return reobj;
}
}
}
調用:
object objCalc = Calculate(
"
((1 + 2) * 3 + 6) / 5
");
Console.WriteLine(objCalc.ToString()); // 結果為3
Console.ReadLine();
Console.WriteLine(objCalc.ToString()); // 結果為3
Console.ReadLine();
注意點:
1、不支持sin、cos等數學函數2、不支持[]、{}等括號和除數字、+、-、*、/以外的字符,建議調用計算函數前進行輸入的驗證。
轉自:http://hi.baidu.com/programed/item/f43cc6d43c6f3848fa576875