我想做相当于:
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/