.NET 3.5表达式树中的赋值

expression-trees linq

是否可以将赋值编码到表达式树中?

一般承认的答案

不,我不相信。

当然,转换lambda表达式时C#编译器不允许它:

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

这会产生错误:

CS0832: An expression tree may not contain an assignment operator

热门答案

你应该能够使用.NET 4.0 Library。通过将Microsoft.Scripting.Core.dll导入.NET 3.5项目。

我使用的是DLR 0.9 - 版本1.0中的Expession.Block和Expression.Scope可能会有一些变化(您可以参考http://www.codeplex.com/dlr/Thread/View.aspx?ThreadId=43234的参考资料)

以下示例将向您展示。

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


许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因