stoway 2004年06月16日
【发布】★通过给出的求值运算公式字符串得到其结果值的类(关键字:公式,Evaluator)★
在实际开发中有时需要根据用户制定的公式然后经过处理并将数值代替参数后来得出此公式的值,因为刚好也做到这里,看了些资料,于是写了一个类调用来实现此功能
public class Evaluator {
object _compiled = null;

private string m_formula;

/// <summary>
/// 计算公式
/// </summary>
public string Formula{
get{
return m_formula;
}
set{
m_formula = value;
}
}

public Evaluator() {
}

public Evaluator(string formula){
Formula = formula;
}

public Double Execute(){
if(Formula == null || Formula == ""){
throw new Exception("请先设置Formula属性!");
}
return this.Execute(Formula);
}
public Double Execute(string formula){
constructEvaluator(formula);
MethodInfo m = _compiled.GetType().GetMethod("GetValue");
return (Double)m.Invoke(_compiled, null);
}
private void constructEvaluator(string formula) {
ICodeCompiler compiler = (new CSharpCodeProvider().CreateCompiler());
CompilerParameters cp = new CompilerParameters();
cp.ReferencedAssemblies.Add("system.dll");

cp.GenerateExecutable = false;
cp.GenerateInMemory = true;

StringBuilder str = new StringBuilder();
str.Append("using System; \n");
str.Append("namespace Stoway { \n");
str.Append("public class Formula { \n");

str.AppendFormat(" public {0} GetValue()","Double");
str.Append("{");
str.AppendFormat(" return Convert.ToDouble({0}); ", formula);
str.Append("}\n");
str.Append("}\n");
str.Append("}");

CompilerResults cr = compiler.CompileAssemblyFromSource(cp, str.ToString());
if (cr.Errors.HasErrors) {
throw new Exception("不是正确的表达式");
}
Assembly a = cr.CompiledAssembly;
_compiled = a.CreateInstance("Stoway.Formula");
}
public static Double GetValue(string formula){
return new Evaluator().Execute(formula);
}
}
-----------
调用方法:
Evaluator evaluator = new Evaluator();
Double num = evaluator.Execute("( 3 + 5 ) * 2 + 56 / 0.25");
也可以:
Double num = Evaluator.GetValue("( 3 + 5 ) * 2 + 56 / 0.25");

是否还有其他方法来实现同样的功能,希望大家多多讨论!
-------------------------------------------------------

相关:
http://www.codeproject.com/csharp/matheval.asp
http://www.codeproject.com/csharp/runtime_eval.asp

其他:
产生自增长ID的存储过程
http://community.csdn.net/Expert/topic/2984/2984428.xml?temp=7.694644E-02
.Net 下安装、调试的常见问题与错误
http://community.csdn.net/Expert/topic/2837/2837439.xml?temp=.878277
...全文
394 点赞 收藏 21
写回复
21 条回复

还没有回复,快来抢沙发~

发动态
发帖子
C#
创建于2007-09-28

8.4w+

社区成员

64.0w+

社区内容

.NET技术 C#
社区公告
暂无公告