ما هي أفضل طريقة لريدلاين التي كتبها شجرة التعبير؟
-
19-08-2019 - |
سؤال
إذا أريد للحصول على إدخال المستخدم من وحدة التحكم لبلدي التعبير شجرة. ما هي أفضل طريقة للقيام بذلك؟ وكيفية جعل متغير 'اسم' بطة الكتابة؟
وهنا هي رمز بلادي.
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
)