2012-12-14 5 views
3

표현식 나무에 익숙해 지려고합니다. 나는 StringBuilder을 만들고, "Helloworld"을 추가하고 그 문자열을 출력하는 간단한 helloWorld 함수를 작성하여 시작할 것이라고 생각했습니다. 이것은 내가 지금까지 무엇을 가지고 :안녕하세요 식탁 나무가있는 세계

var stringBuilderParam = Expression.Variable 
    typeof(StringBuilder), "sb"); 

var helloWorldBlock = 
    Expression.Block(new Expression[] 
     { 
      Expression.Assign(
       stringBuilderParam, 
       Expression.New(typeof(StringBuilder))), 
      Expression.Call(
       stringBuilderParam, 
       typeof(StringBuilder).GetMethod(
        "Append", 
        new[] { typeof(string) }), 
       new Expression[] 
        { 
         Expression.Constant(
          "Helloworld", typeof(string)) 
        }), 
      Expression.Call(
       stringBuilderParam, 
       "ToString", 
       new Type[0], 
       new Expression[0]) 
     }); 

var helloWorld = Expression.Lamda<Func<string>>(helloWorldBlock).Compile(); 

Console.WriteLine(helloWorld); 
Console.WriteLine(helloWorld()); 
Console.ReadKey(); 

Compile() 유형의 'System.Text.StringBuilder' ''범위 참조 대상의 InvalidOperationException

변수 'SB'가 발생하지만 정의되지 않은

분명히 나는 ​​올바른 방법을 사용하지 않을 것입니다. 누군가 올바른 방향으로 나를 가리킬 수 있습니까?


분명히 Console.WriteLine("HelloWorld");은 다소 간단 할 것입니다.

+0

코드를 자르고 붙이려고했지만 더 많은 컴파일러 오류가 발생했습니다. 게시 할 수있는 코드가 더 있습니까? –

+0

@ IanO'Brien, 그 코드를 잘못 복사 한 것 같습니다. 어떤 컴파일러 오류가 발생합니까? – Jodrell

답변

3

변수를 사용하려면 BlockExpression에 대한 변수를 지정해야합니다. 그냥 another overload을 호출하십시오 :

var helloWorldBlock = 
    Expression.Block(
     new ParameterExpression[] {stringBuilderParam}, 
     new Expression[] 
      { 
       Expression.Assign(
        stringBuilderParam, 
        Expression.New(typeof (StringBuilder))), 
       Expression.Call(
        stringBuilderParam, 
        typeof (StringBuilder).GetMethod(
         "Append", 
         new[] {typeof (string)}), 
        new Expression[] 
         { 
          Expression.Constant(
           "Helloworld", typeof (string)) 
         }), 
       Expression.Call(
        stringBuilderParam, 
        "ToString", 
        new Type[0], 
        new Expression[0]) 
      }); 
+0

간단하니, 고맙습니다. – Jodrell

관련 문제