c# - 如何动态评估 C# 表达式?

标签 c# reflection eval

我想做相当于:

object result = Eval("1 + 3");
string now    = Eval("System.DateTime.Now().ToString()") as string

关注 Biri s link ,我得到了这个片段(修改以删除过时的方法 ICodeCompiler.CreateCompiler():

private object Eval(string sExpression)
{
    CSharpCodeProvider c = new CSharpCodeProvider();
    CompilerParameters cp = new CompilerParameters();

    cp.ReferencedAssemblies.Add("system.dll");

    cp.CompilerOptions = "/t:library";
    cp.GenerateInMemory = true;

    StringBuilder sb = new StringBuilder("");
    sb.Append("using System;\n");

    sb.Append("namespace CSCodeEvaler{ \n");
    sb.Append("public class CSCodeEvaler{ \n");
    sb.Append("public object EvalCode(){\n");
    sb.Append("return " + sExpression + "; \n");
    sb.Append("} \n");
    sb.Append("} \n");
    sb.Append("}\n");

    CompilerResults cr = c.CompileAssemblyFromSource(cp, sb.ToString());
    if (cr.Errors.Count > 0)
    {
        throw new InvalidExpressionException(
            string.Format("Error ({0}) evaluating: {1}", 
            cr.Errors[0].ErrorText, sExpression));
    }

    System.Reflection.Assembly a = cr.CompiledAssembly;
    object o = a.CreateInstance("CSCodeEvaler.CSCodeEvaler");

    Type t = o.GetType();
    MethodInfo mi = t.GetMethod("EvalCode");

    object s = mi.Invoke(o, null);
    return s;

}  

最佳答案

老话题,但考虑到这是谷歌搜索时最先出现的话题之一,这里有一个更新的解决方案。

您可以使用 Roslyn's new Scripting API to evaluate expressions .

如果您使用的是 NuGet,只需将依赖项添加到 Microsoft.CodeAnalysis.CSharp.Scripting . 要评估您提供的示例,非常简单:

var result = CSharpScript.EvaluateAsync("1 + 3").Result;

这显然没有利用脚本引擎的异步功能。

您还可以根据需要指定评估的结果类型:

var now = CSharpScript.EvaluateAsync<string>("System.DateTime.Now.ToString()").Result;

要评估更高级的代码片段、传递参数、提供引用、命名空间等等,请查看上面链接的 wiki。

关于c# - 如何动态评估 C# 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53844/

相关文章:

c# - DropDownList 选定值在 POST 操作的模型中设置为 "null"

c# - 如何在 C# 中写入运行时生成的 .dll 文件?

c# - Type.GetProperties() 是否保证 PropertyInfo[] 结果的特定顺序?

python - 当我使用全局变量运行 eval 时,为什么不复制全局变量?

javascript - 未捕获的语法错误 : Unexpected Identifer, 也是匿名函数错误

c# - 无法将委托(delegate)转换为泛型类型 T

c# - 是否可以使用哈希表作为锁定对象?

c++ - C++ 中的最小反射

c# - 给定类型 ExpressionType.MemberAccess,如何获取字段值?

java - Java 中 eval() 解析器和二维数组的实现