ما هي أفضل طريقة لريدلاين التي كتبها شجرة التعبير؟

StackOverflow https://stackoverflow.com/questions/466292

سؤال

إذا أريد للحصول على إدخال المستخدم من وحدة التحكم لبلدي التعبير شجرة. ما هي أفضل طريقة للقيام بذلك؟ وكيفية جعل متغير 'اسم' بطة الكتابة؟

وهنا هي رمز بلادي.

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();
        }
    }
}
هل كانت مفيدة؟

المحلول

صممت

وأشجار التعبير لتنفيذ عملية ثابتة - على وجه الخصوص، والوصول عضوا سوف ترغب في MemberInfo المعروفة (الخ) عند نقطة من إنشاء شجرة التعبير (لأنها غير قابلة للتغيير)

هل يمكن تكرار الشفرة التي تم إنشاؤها من dynamic إذا كنت تلعب مع 4.0، ولكن لنكون صادقين، والنهج الأفضل في هذا السيناريو هو ببساطة: لا تستخدم شجرة التعبير

وإما انعكاس أو ComponentModel (TypeDescriptor) سيكون مثاليا لهذا الوصول حيوي إلى الأعضاء.

وأيضا - لدعوة Compile على شيء كنت تستخدم مرة واحدة فقط لا إنقاذ أي وقت، واستخدام DynamicInvoke ليس إما ... كنت بحاجة إلى استخدام النموذج مندوب كتبته (Invoke)

.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top