0

単純な静的メソッドを使用してオブジェクトを返し、式を動的に評価しようとしています。ここの例で概説されているアドバイスに従いました: 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 + @";
                    }
                }
            }"
        };
    }
4

1 に答える 1