Was ist der beste Weg, durch den Ausdruck Baum Readline-?
-
19-08-2019 - |
Frage
Wenn ich eine Benutzereingabe von Konsole zu meinem Expression Baum erhalten möge. Was ist der beste Weg, es zu tun? und wie Variable 'name' Ente eingeben machen?
Hier mein Code.
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();
}
}
}
Lösung
Expression Bäume sind so konzipiert, eine feste Operation auszuführen -. Insbesondere der Mitglied-Zugang eine bekannte MemberInfo
(etc) an der Stelle des Ausdruck Baum Schöpfung wollen, wird (da sie unveränderlich sind)
Sie könnten duplizieren Sie die generierten Code aus dynamic
wenn Sie mit 4.0 spielen, aber um ehrlich zu sein, der besseren Ansatz in diesem Szenario ist einfach:. keinen Ausdrucksbaum verwenden
So oder Reflexion oder ComponentModel
(TypeDescriptor
) würde für diesen dynamischen Zugang zu einem Mitglied ideal.
Auch - Aufruf Compile
auf etwas, das man nur einmal verwenden Sie keine Zeit spart und DynamicInvoke
nicht mit entweder ... müssen Sie die typisierten Delegaten Form (Invoke
) verwenden,