zoukankan      html  css  js  c++  java
  • LINQ表达式树4

    执行表达式目录树

    前面已经可以构造出一个表达式目录树了,现在看看如何去执行表达式目录树。我们需要调用Compile方法来创建一个可执行委托,并且调用该委托,如下面的代码:

    static void Main(string[] args)
    {
        ParameterExpression paraLeft = Expression.Parameter(typeof(int), "a");
        ParameterExpression paraRight = Expression.Parameter(typeof(int), "b");
        BinaryExpression binaryLeft = Expression.Multiply(paraLeft, paraRight);
        ConstantExpression conRight = Expression.Constant(2, typeof(int));
        BinaryExpression binaryBody = Expression.Add(binaryLeft, conRight);
        Expression<Func<int, int, int>> lambda = 
            Expression.Lambda<Func<int, int, int>>(binaryBody, paraLeft, paraRight);
        Func<int, int, int> myLambda = lambda.Compile();
        int result = myLambda(2, 3);
        Console.WriteLine("result:" + result.ToString());
        Console.Read();
    }

    运行后输出的结果:

    TerryLee_0159

    这里我们只要简单的调用Compile方法就可以了,事实上在.NET Framework中是调用了一个名为ExpressionCompiler的内部类来做表达式目录树的执行(注意此处的Compiler不等同于编译器的编译)。另外,只能执行表示Lambda表达式的表达式目录树,即LambdaExpression或者Expression<TDelegate>类型。如果表达式目录树不是表示Lambda表达式,需要调用Lambda方法创建一个新的表达式。如下面的代码:

    static void Main(string[] args)
    {
        BinaryExpression body = Expression.Add(
            Expression.Constant(2),
            Expression.Constant(3));
        Expression<Func<int>> expression = 
            Expression.Lambda<Func<int>>(body, null);
        Func<int> lambda = expression.Compile();
        Console.WriteLine(lambda());
    }
  • 相关阅读:
    BZOJ 1202: [HNOI2005]狡猾的商人( 差分约束 )
    BZOJ 1800: [Ahoi2009]fly 飞行棋( 枚举 )
    BZOJ 2006: [NOI2010]超级钢琴( RMQ + 堆 )
    BZOJ 1029: [JSOI2007]建筑抢修( 贪心 )
    FZU 2233 ~APTX4869 贪心+并查集
    FZU2232 炉石传说 最大匹配
    FZU 2237 中位数 主席树 树上k大
    CodeForcesGym 100753B Bounty Hunter II 二分图最小路径覆盖
    NOIP2010关押罪犯 二分+二染色
    POJ2236 Wireless Network 并查集
  • 原文地址:https://www.cnblogs.com/meilibao/p/2681340.html
Copyright © 2011-2022 走看看