• 表达式树基础代码


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Reflection;
    using System.Text;
    using System.Threading.Tasks;
    using System.Linq.Expressions;
    
    namespace TestExpressionLambda
    {
        class ProgramExpression
        {
            static void Main(string[] args)
            {
                ExpressionAdd();
    
                ExpressionFromlambda();
    
                ExpressionStartWith();
    
                Console.Read();
            }
    
            /// <summary>
            /// 最简单的加法表达式树
            /// 
            ///                   根节点
            ///                   BanaryExpression
            ///                   NodeType = Add
            ///                   Type=System.Int32
            /// 
            ///     左叶子                          右叶子
            ///     firstArg                        secondArg
            ///     ConstantExpression              ConstantExpression
            ///     NodeType=Constant               NodeType=Constant
            ///     Type=System.Int32               Type=System.Int32
            ///     Value=3                         Value=2
            /// 
            /// 
            /// </summary>
            private static void ExpressionAdd()
            {
                //构建常量表达式3
                ConstantExpression firstArg = Expression.Constant(3);
                //构建常量表达式2
                ConstantExpression secondArg = Expression.Constant(2);
    
                //构建+表达式 3+2
                BinaryExpression add = Expression.Add(firstArg, secondArg);
                Console.WriteLine(add);//输出 : (3+2)
    
                //获取委托表达式
                Expression<Func<int>> addExpression = Expression.Lambda<Func<int>>(add);
                //Compile出委托,内部调用了emit去构造il
                Func<int> addFunc = addExpression.Compile();
    
                Console.WriteLine(addFunc);//输出System.Func~1[Int32]
                Console.WriteLine(addFunc());//输出执行的结果:5
            }
    
            /// <summary>
            /// 简单从lambda创建表达式树
            /// ps:不能讲带有语句块的lambda转换成表达式树
            /// </summary>
            private static void ExpressionFromlambda()
            {
                Expression<Func<int>> lambadExpression = () => 3 + 2;
                Func<int> lambdaFunc = lambadExpression.Compile();
                Console.WriteLine(lambdaFunc);
                Console.WriteLine(lambdaFunc());
            }
    
            /// <summary>
            /// 表达式树去调用string类型的StartWith方法
            /// 要实现类型lambda表达式:(x,y) => x.StartsWith(y)
            /// </summary>
            private static void ExpressionStartWith()
            {
                //反射取到string的StartsWith方法
                MethodInfo method = typeof(string).GetMethod("StartsWith", new[] { typeof(string) });
    
                //取参数表达式:x,y
                ParameterExpression x = Expression.Parameter(typeof(string), "x");
                ParameterExpression y = Expression.Parameter(typeof(string), "y");
    
                //StartsWith方法需要的参数
                Expression[] methodArgs = new[] { y };
                //生成调用表达式
                MethodCallExpression call = Expression.Call(x, method, y);
    
                var lambdaParameters = new[] { x, y };
                //Expression.Lambda方法生成表达式树委托
                Expression<Func<string, string, bool>> lambda = Expression.Lambda<Func<string, string, bool>>(call,
                    lambdaParameters);
    
                //Compile出委托
                Func<string, string, bool> func = lambda.Compile();
    
                Console.WriteLine(func("First", "Second"));
                Console.WriteLine(func("First", "Fir"));
            }
        }
    }
    
  • 相关阅读:
    Android中ProgressDialog的应用
    Content的startActivity方法需添加FLAG_ACTIVITY_NEW_TASK flag
    android onKeydown
    8 个最优秀的 Android Studio 插件
    Android 异步加载图片,使用LruCache和SD卡或手机缓存,效果非常的流畅
    Android提供的LruCache类简介
    Android设计中的.9.png与Android Studio中的设置
    js实现双击后网页自己主动跑-------Day55
    Oracle经常使用函数
    《R实战》读书笔记三
  • 原文地址:https://www.cnblogs.com/12taotie21/p/3991659.html
Copyright © 2020-2023  润新知