调用:Evaluator.EvalToDouble("(512+100)/300");
using System;
using System.CodeDom.Compiler;
using System.Reflection;
using Microsoft.JScript;
namespace mysoft
{
public class Evaluator
{
public static int EvalToInteger(string statement)
{
string s = EvalToString(statement);
return int.Parse(s.ToString());
}
public static double EvalToDouble(string statement)
{
string s = EvalToString(statement);
return double.Parse(s);
}
public static string EvalToString(string statement)
{
object o = EvalToObject(statement);
return o.ToString();
}
public static object EvalToObject(string statement)
{
return _evaluatorType.InvokeMember(
"Eval",
BindingFlags.InvokeMethod,
null,
_evaluator,
new object[] { statement }
);
}
static Evaluator()
{
ICodeCompiler compiler;
compiler = new JScriptCodeProvider().CreateCompiler();
CompilerParameters parameters;
parameters = new CompilerParameters();
parameters.GenerateInMemory = true;
CompilerResults results;
results = compiler.CompileAssemblyFromSource(parameters, _jscriptSource);
Assembly assembly = results.CompiledAssembly;
_evaluatorType = assembly.GetType("Evaluator.Evaluator");
_evaluator = Activator.CreateInstance(_evaluatorType);
}
private static object _evaluator = null;
private static Type _evaluatorType = null;
private static readonly string _jscriptSource =
@"package Evaluator
{
class Evaluator
{
public function Eval(expr : String) : String
{
return eval(expr);
}
}
}";
}
}
相关文章
- MySQL自定义函数与存储过程的创建、使用、删除
- 归纳整理Linux下C语言常用的库函数----文件操作
- 在论坛中出现的比较难的sql问题:29(row_number函数 组内某列的值连续出现3次标记出来)
- C#程序代码中常用的快捷键
- Unity C#写的A*寻路
- C#中dynamic的正确用法 以及 typeof(DynamicSample).GetMethod("Add");
- ffmpeg中av_image_alloc函数的用法 以及 另一种同样功能的函数用法
- C#里使用libxl来加载网络传送过来的EXCEL文件
- ORACLE · 保留两位小数的三种方法 · 方法一 round函数
- 密码学的hash函数,哈希碰撞, collision resistance, BTC用到的SHA-256简介