2009-01-21 68 views
1

如果我想從控制檯獲取用戶輸入到我的表達式樹。什麼是最好的方式來做到這一點?以及如何使變量'名稱'鴨子打字?表達式樹的ReadLine的最佳方式是什麼?

這是我的代碼。

using System; 
using System.Reflection; 
using System.Collections.Generic; 
using Microsoft.Linq; 
using Microsoft.Linq.Expressions; 

namespace ExpressionTree 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      List<Expression> statements = new List<Expression>(); 

      // Output 
      MethodInfo Write = typeof(System.Console).GetMethod("Write", new Type[] { typeof(string) }); 
      ConstantExpression param = Expression.Constant("What is your name? ", typeof(string)); 
      Expression output = Expression.Call(null, Write, param); 
      statements.Add(output); 

      // Input 
      MethodInfo ReadLine = typeof(System.Console).GetMethod("ReadLine"); 
      ParameterExpression exprName = Expression.Variable(typeof(String), "name"); 
      Expression exprReadLine = Expression.Call(null, ReadLine); 

      // .NET 4.0 (DlR 0.9) from Microsoft.Scripting.Core.dll 
      // Expression.Assign and Expression.Scope 
      ScopeExpression input = Expression.Scope(Expression.Assign(exprName, exprReadLine), exprName); 
      statements.Add(input); 

      // Create the lambda 
      LambdaExpression lambda = Expression.Lambda(Expression.Block(statements)); 

      // Compile and execute the lambda 
      lambda.Compile().DynamicInvoke(); 

      Console.ReadLine(); 
     } 
    } 
} 

回答

1

表達式樹被設計爲執行一個固定的操作 - 特別是,所述成員訪問會希望已知MemberInfo(等)在表達式樹創建的點(因爲它們是不可變的)。

如果你玩的是4.0,你可以複製generated code from dynamic,但說實話,在這種情況下更好的方法是:不要使用表達式樹。

無論是反射還是ComponentModelTypeDescriptor)都是理想的動態訪問成員。

此外 - 僅在您使用一次的東西上調用Compile不會節省任何時間,並且使用DynamicInvoke不是...您需要使用鍵入的委託表單(Invoke)。

+0

@MarkGravell:我遇到了表達式樹和動態類型的答案,並且發現它們非常有幫助。謝謝!然而,我難住了[這個問題](http://stackoverflow.com/q/24939618/938668)。如果你有機會看看,我會很感激你的想法。 – 2014-07-24 17:05:59

相關問題