欢迎光临
我们一直在努力

我已经解决了,以下是解决的类的详细信息:-.NET教程,Windows开发

建站超值云服务器,限时71元/月

如果在文本框中输入简单的数学计算式: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
 

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 我已经解决了,以下是解决的类的详细信息:-.NET教程,Windows开发
分享到: 更多 (0)

相关推荐

  • 暂无文章