.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合法嗎? 是的,了解原因