用弦中的幂运算来计算算术表达式

时间:2017-06-14 08:44:12

标签: c# string expression exponentiation

我需要使用字符串中的指数来计算算术表达式,例如:

string expression = "4*5+2^3"

^符号可以更改为任何其他符号或字符串,但必须以与+ - *操作相同的方式编写,因为数字和运算符在某种程度上是随机生成的。 有办法吗?我不确定你能否在NCalc或Jace.Net中以这种方式编写取幂运算

1 个答案:

答案 0 :(得分:0)

您可以编写如下的Evaluator类来动态执行C#代码:

public class Evaluator
{
    public int Evaluate(string expression)
    {
        CSharpCodeProvider codeProvider = new CSharpCodeProvider();
        CompilerParameters compilerParameters = new CompilerParameters();
        compilerParameters.ReferencedAssemblies.Add("system.dll");
        compilerParameters.CompilerOptions = "/t:library";
        compilerParameters.GenerateInMemory = true;

        StringBuilder typeDefinition = new StringBuilder("");
        typeDefinition.AppendLine("using System;");
        typeDefinition.AppendLine("namespace Evaluator");
        typeDefinition.AppendLine("{");
        typeDefinition.AppendLine("    public class Evaluator");
        typeDefinition.AppendLine("    {");
        typeDefinition.AppendLine("        public object Evaluate()");
        typeDefinition.AppendLine("        {");
        typeDefinition.AppendLine("            return " + expression + ";");
        typeDefinition.AppendLine("        }");
        typeDefinition.AppendLine("    }");
        typeDefinition.AppendLine("}");

        CompilerResults compilerResult = codeProvider.CompileAssemblyFromSource(compilerParameters, typeDefinition.ToString());

        System.Reflection.Assembly a = compilerResult.CompiledAssembly;
        object o = a.CreateInstance("Evaluator.Evaluator");
        Type dynamicEvaluatorType = o.GetType();
        MethodInfo dynamicEvaluateMethod = dynamicEvaluatorType.GetMethod("Evaluate");
        return (int) dynamicEvaluateMethod.Invoke(o, null);
    }
}

然后你可以这样使用它:

        string expression = "4*5+2";
        int result = new Evaluator().Evaluate(expression);