如何将字符串作为代码执行

本文关键字:代码 执行 字符串 | 更新日期: 2023-09-27 18:30:01

我目前正在制作一个计算器。我知道如何写逻辑,但我很好奇是否可以用我要解释的方式来写。

String str = "12 + 43 * (12 / 2)";
int answer;
answer = str.magic(); 
//str.magic is the same as 
answer =   12 + 43 * (12 / 2);

现在我想要的是如何将str转换为可执行的代码。

如何将字符串作为代码执行

您可以使用CodeDom来获得"本机"C#解析器。(您应该改进错误处理。)

using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.Reflection;
...
static void Main()
{
    double? result = Calculate("12 + 43 * (12 / 2)");
}
static double? Calculate(string formula)
{
    double result;
    try
    {
        CompilerParameters compilerParameters = new CompilerParameters
        {
            GenerateInMemory = true, 
            TreatWarningsAsErrors = false, 
            GenerateExecutable = false, 
        };
        string[] referencedAssemblies = { "System.dll" };
        compilerParameters.ReferencedAssemblies.AddRange(referencedAssemblies);
        const string codeTemplate = "using System;public class Dynamic {{static public double Calculate(){{return {0};}}}}";
        string code = string.Format(codeTemplate, formula);
        CSharpCodeProvider provider = new CSharpCodeProvider();
        CompilerResults compilerResults = provider.CompileAssemblyFromSource(compilerParameters, new string[]{code});
        if (compilerResults.Errors.HasErrors)
            throw new Exception();
        Module module = compilerResults.CompiledAssembly.GetModules()[0];
        Type type = module.GetType("Dynamic");
        MethodInfo method = type.GetMethod("Calculate");
        result = (double)(method.Invoke(null, null));
    }
    catch (Exception)
    {
        return null;
    }
    return result;
}

您可以简单地使用NCalc库单击此处获取更多信息。你可以从这里下载dll文件

示例:

NCalc.Expression exp= new NCalc.Expression("(12*3)-29");
object obj = exp.Evaluate();
MessageBox.Show(obj.ToString());