传递和使用CodeDom动态方法中的列表

本文关键字:方法 列表 动态 CodeDom | 更新日期: 2023-09-27 17:50:01

我试图使用一个简单的静态方法来返回一个对象来动态地评估表达式。我遵循了以下示例中列出的建议: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 + @";
                    }
                }
            }"
        };
    }

传递和使用CodeDom动态方法中的列表

CompilerResults类型包含Errors属性。如果你往里看,你会发现:

错误CS0234:类型或名称空间名称'Linq'在名称空间'System'中不存在(您是否缺少程序集引用?)

这是因为System.Linq名称空间中的类型(如Enumerable)位于System.Core.dll程序集中。如果您添加了它,那么您的代码将开始工作:

parameters.ReferencedAssemblies.Add("System.Core.dll");