2014-03-13 11 views
0

간단한 정적 메서드를 사용하여 개체를 반환하여 식을 동적으로 평가하려고합니다. 나는 여기 예제에 설명 된 조언을 따랐다 : http://www.blackwasp.co.uk/RuntimeCompilation_2.aspx 기본 표현식에 대해서는 정상적으로 작동하지만, .Contains() 메소드를 사용하는 경우에는 예외가 발생한다.CodeDom 동적 메서드에서 목록 전달 및 사용

근무 전화 :

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

CompilerResults 유형 자산 Errors가 포함되어 있습니다. 당신이에 보면, 당신은 발견 할 것이다 :

오류 CS0234 : 형식 또는 네임 스페이스 이름 'Linq에는'네임 스페이스 '시스템'(? 당신이 어셈블리 참조가 누락)에 존재하지 않는

System.Linq 네임 스페이스의 형식 (예 : Enumerable)이 System.Core.dll 어셈블리에 있기 때문입니다. 그 코드를 추가하면 코드가 작동하기 시작합니다.

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

정말 고맙습니다. 수많은 참조를 추가/삭제하려고 시도했지만 올바른 조합을 찾을 수 없었습니다. 이제 완벽하게 작동합니다. – spotvader