c#根据公式进行自动计算的实现
2013-03-05 15:03
417 查看
代码:
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;
}
}
}
调用:
object objCalc = Calculate("((1 + 2) * 3 + 6) / 5 ");
Console.WriteLine(objCalc.ToString()); //结果为3
Console.ReadLine();
注意点:
1、不支持sin、cos等数学函数
2、不支持[]、{}等括号和除数字、+、-、*、/以外的字符,建议调用计算函数前进行输入的验证。
转自:http://hi.baidu.com/programed/item/f43cc6d43c6f3848fa576875
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;
}
}
}
调用:
object objCalc = Calculate("((1 + 2) * 3 + 6) / 5 ");
Console.WriteLine(objCalc.ToString()); //结果为3
Console.ReadLine();
注意点:
1、不支持sin、cos等数学函数
2、不支持[]、{}等括号和除数字、+、-、*、/以外的字符,建议调用计算函数前进行输入的验证。
转自:http://hi.baidu.com/programed/item/f43cc6d43c6f3848fa576875
相关文章推荐
- c#根据公式进行自动计算的实现
- c#根据公式进行自动计算的实现
- c#根据公式进行自动计算的实现
- c#根据公式进行自动计算 四个5加减乘除=4
- C#实现根据年月日计算星期几的函数
- MVEL实现java直接根据公式计算结果
- C#实现根据地图上的两点坐标,计算直线距离
- c#中利用google map距离计算公式实现两点间距离的计算
- C#实现的根据年月日计算星期几的函数 选择自 fanz2000 的 Blog
- C#中实现根据年月日计算星期几的函数
- C#实现根据图片的EXIF自动调整图片方向
- C#实现的根据年月日计算星期几的函数
- C#中字符串转换为计算公式,并进行计算的方法(自定义公式的计算)
- C#实现的根据年月日计算星期几的函数
- C#实现的根据年月日计算星期几的函数
- 问题:C#根据生日计算属相;结果:C#实现根据年份计算生肖属相的方法
- C#实现的根据年月日计算星期几的函数
- MVEL实现java直接根据公式计算结果
- C#实现的根据年月日计算星期几的函数
- 描述一下C#中索引器的实现过程,是否只能根据数字进行索引?