/// <summary>
/// 动态编译公式计算
/// </summary>
/// <param name="formula">公式</param>
/// <returns>结果</returns>
public static decimal AutoCalculateToDecimal(string formula)
{
CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerParameters parameter = new CompilerParameters();
parameter.ReferencedAssemblies.Add("System.dll");
parameter.GenerateExecutable = false;
parameter.GenerateInMemory = true;
CompilerResults result = provider.CompileAssemblyFromSource(parameter,
CreateCode(formula));//将你的式子放在这里
if (result.Errors.Count <= 0)
{
Assembly assembly = result.CompiledAssembly;
Type AType = assembly.GetType("AutoCalculate.Calculate");
MethodInfo method = AType.GetMethod("CalculateFunc");
return Math.Round(Convert.ToDecimal(method.Invoke(null, null)), 2);
}
else
{
return 0;
}
}
/// <summary>
/// 虚拟命名空间
/// </summary>
/// <param name="para">公式</param>
/// <returns>命名空间字符串</returns>
private static string CreateCode(string formula)
{
return "using System; namespace AutoCalculate{public static class Calculate{public static object CalculateFunc(){return " + formula + ";}}}";
}
/// 动态编译公式计算
/// </summary>
/// <param name="formula">公式</param>
/// <returns>结果</returns>
public static decimal AutoCalculateToDecimal(string formula)
{
CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerParameters parameter = new CompilerParameters();
parameter.ReferencedAssemblies.Add("System.dll");
parameter.GenerateExecutable = false;
parameter.GenerateInMemory = true;
CompilerResults result = provider.CompileAssemblyFromSource(parameter,
CreateCode(formula));//将你的式子放在这里
if (result.Errors.Count <= 0)
{
Assembly assembly = result.CompiledAssembly;
Type AType = assembly.GetType("AutoCalculate.Calculate");
MethodInfo method = AType.GetMethod("CalculateFunc");
return Math.Round(Convert.ToDecimal(method.Invoke(null, null)), 2);
}
else
{
return 0;
}
}
/// <summary>
/// 虚拟命名空间
/// </summary>
/// <param name="para">公式</param>
/// <returns>命名空间字符串</returns>
private static string CreateCode(string formula)
{
return "using System; namespace AutoCalculate{public static class Calculate{public static object CalculateFunc(){return " + formula + ";}}}";
}