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();
        }
    }
}
War es hilfreich?

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,

.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top