2009-01-21 88 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

相关问题