Zuordnung in .NET 3.5-Ausdrucksbäumen

expression-trees linq

Frage

Ist es möglich, eine Zuordnung in einen Ausdrucksbaum zu codieren?

Akzeptierte Antwort

Nein, das glaube ich nicht.

Sicherlich lässt der C # -Compiler es nicht zu, wenn ein Lambda-Ausdruck konvertiert wird:

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

Dies ergibt den Fehler:

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

Beliebte Antwort

Sie sollten es mit .NET 4.0-Bibliothek tun können. Importieren Sie Microsoft.Scripting.Core.dll in Ihr .NET 3.5-Projekt.

Ich benutze DLR 0.9 - Es könnte einige Änderungen in Expession.Block und Expression.Scope in Version 1.0 geben (Sie können eine Referenz von http://www.codeplex.com/dlr/Thread/View.aspx?ThreadId=43234 sehen )

Folgendes Beispiel soll Ihnen zeigen.

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();
        }
    }
}



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum