Affectation dans les arborescences d'expression .NET 3.5

expression-trees linq

Question

Est-il possible de coder une affectation dans un arbre d'expression?

Réponse acceptée

Non, je ne crois pas.

Le compilateur C # l’interdit certainement lors de la conversion d’une expression lambda:

int x;
Expression<Func<int,int>> foo = (x=y); // Assign to x and return value

Cela donne l'erreur:

CS0832: An expression tree may not contain an assignment operator

Réponse populaire

Vous devriez pouvoir le faire avec .NET 4.0 Library. en important Microsoft.Scripting.Core.dll dans votre projet .NET 3.5.

J'utilise DLR 0.9 - Il se peut que des modifications soient apportées à Expession.Block et Expression.Scope dans la version 1.0 (vous pouvez consulter une référence à partir de http://www.codeplex.com/dlr/Thread/View.aspx?ThreadId=43234 )

L'échantillon suivant est à vous montrer.

using System;
using System.Collections.Generic;
using Microsoft.Scripting.Ast;
using Microsoft.Linq.Expressions;
using System.Reflection;

namespace dlr_sample
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Expression> statements = new List<Expression>();

            ParameterExpression x = Expression.Variable(typeof(int), "r");
            ParameterExpression y = Expression.Variable(typeof(int), "y");

            statements.Add(
                Expression.Assign(
                    x,
                    Expression.Constant(1)
                )
             );

            statements.Add(
                Expression.Assign(
                    y,
                    x
                )
             );

            MethodInfo cw = typeof(Console).GetMethod("WriteLine", new Type[] { typeof(int) });

            statements.Add(
                Expression.Call(
                    cw,
                    y
                )
            );

            LambdaExpression lambda = Expression.Lambda(Expression.Scope(Expression.Block(statements), x, y));

            lambda.Compile().DynamicInvoke();
            Console.ReadLine();
        }
    }
}


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow