我试图使用一个简单的静态方法来返回一个对象来动态评估表达式。我遵循了以下示例中概述的建议:http://www.blackwasp.co.uk/RuntimeCompilation_2.aspx
对于基本表达式,这工作正常,但对于涉及.Contains()方法的那些,我会抛出一个异常。
工作电话:
Console.WriteLine(DynamicCodeUtils.TestExpression("1 == 1 && (2 == 3 || 2 == 2) && 4 == 5");
Output: false
Console.WriteLine(DynamicCodeUtils.TestExpression("Math.Max(100,200)"));
Output: 200
非工作电话:
string _ArrayCheck = "\"1,2,3\".Split(',').ToArray().Contains(\"1\")";
Console.WriteLine(DynamicCodeUtils.TestExpression(_ArrayCheck));
Throws an exception - expected output would be "true"
代码:
public static object TestExpression(string Expression)
{
CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerParameters parameters = new CompilerParameters();
parameters.GenerateExecutable = false;
parameters.GenerateInMemory = true;
parameters.ReferencedAssemblies.Add("System.dll");
parameters.ReferencedAssemblies.Add("System.Xml.dll");
parameters.ReferencedAssemblies.Add("System.Xml.Linq.dll");
CompilerResults results = provider.CompileAssemblyFromSource(parameters, GetCode(Expression));
var cls = results.CompiledAssembly.GetType("DynamicNS.DynamicCode");
var method = cls.GetMethod("DynamicMethod", BindingFlags.Static | BindingFlags.Public);
return method.Invoke(null, null);
}
public static string[] GetCode(string Expression)
{
return new string[]
{
@"
using System;
using System.Linq;
namespace DynamicNS
{
public static class DynamicCode
{
public static object DynamicMethod()
{
return " + Expression + @";
}
}
}"
};
}
答案 0 :(得分:0)
CompilerResults
类型包含属性Errors
。如果你研究一下,你会发现:
错误CS0234:命名空间“System”中不存在类型或命名空间名称“Linq”(您是否缺少程序集引用?)
这是因为System.Linq
命名空间中的类型(如Enumerable
)位于System.Core.dll
程序集中。如果你添加它,那么你的代码将开始工作:
parameters.ReferencedAssemblies.Add("System.Core.dll");