如果在文本框中输入简单的数学计算式:200+100*290之类的计算式,如何计算出他们的值:
using system;
using system.codedom;
using system.codedom.compiler;
using microsoft.csharp;
using system.text;
using system.reflection;
namespace adoguy
{
/// <summary>
/// summary description for class1.
/// </summary>
public class evaluator
{
public evaluator(evaluatoritem[] items)
{
constructevaluator(items);
}
public evaluator(type returntype, string expression, string name)
{
evaluatoritem[] items = { new evaluatoritem(returntype, expression, name) };
constructevaluator(items);
}
public evaluator(evaluatoritem item)
{
evaluatoritem[] items = { item };
constructevaluator(items);
}
private void constructevaluator(evaluatoritem[] items)
{
icodecompiler comp = (new csharpcodeprovider().createcompiler());
compilerparameters cp = new compilerparameters();
cp.referencedassemblies.add("system.dll");
cp.referencedassemblies.add("system.data.dll");
cp.referencedassemblies.add("system.xml.dll");
cp.generateexecutable = false;
cp.generateinmemory = true;
stringbuilder code = new stringbuilder();
code.append("using system; \n");
code.append("using system.data; \n");
code.append("using system.data.sqlclient; \n");
code.append("using system.data.oledb; \n");
code.append("using system.xml; \n");
code.append("namespace adoguy { \n");
code.append(" public class _evaluator { \n");
foreach(evaluatoritem item in items)
{
code.appendformat(" public {0} {1}() ",
item.returntype.name,
item.name);
code.append("{ ");
code.appendformat(" return ({0}); ", item.expression);
code.append("}\n");
}
code.append("} }");
compilerresults cr = comp.compileassemblyfromsource(cp, code.tostring());
if (cr.errors.haserrors)
{
stringbuilder error = new stringbuilder();
error.append("error compiling expression: ");
foreach (compilererror err in cr.errors)
{
error.appendformat("{0}\n", err.errortext);
}
throw new exception("error compiling expression: " + error.tostring());
}
assembly a = cr.compiledassembly;
_compiled = a.createinstance("adoguy._evaluator");
}
public int evaluateint(string name)
{
return (int) evaluate(name);
}
public string evaluatestring(string name)
{
return (string) evaluate(name);
}
public bool evaluatebool(string name)
{
return (bool) evaluate(name);
}
public object evaluate(string name)
{
methodinfo mi = _compiled.gettype().getmethod(name);
return mi.invoke(_compiled, null);
}
static public int evaluatetointeger(string code)
{
evaluator eval = new evaluator(typeof(int), code, staticmethodname);
return (int) eval.evaluate(staticmethodname);
}
static public string evaluatetostring(string code)
{
evaluator eval = new evaluator(typeof(string), code, staticmethodname);
return (string) eval.evaluate(staticmethodname);
}
static public bool evaluatetobool(string code)
{
evaluator eval = new evaluator(typeof(bool), code, staticmethodname);
return (bool) eval.evaluate(staticmethodname);
}
static public object evaluatetoobject(string code)
{
evaluator eval = new evaluator(typeof(object), code, staticmethodname);
return eval.evaluate(staticmethodname);
}
const string staticmethodname = "__foo";
type _compiledtype = null;
object _compiled = null;
}//class
public class evaluatoritem
{
public evaluatoritem(type returntype, string expression, string name)
{
returntype = returntype;
expression = expression;
name = name;
}
public type returntype;
public string name;
public string expression;
}//class
}//namespace
