表达式目录树Expression

委托

// 定义两个输入参数,一个输出参数
 Func<int, int, int> func = (m, n) => (m + n);
 Console.WriteLine(func.Invoke(3,5));

 

调用表达式目录树

 Expression<Func<int, int>> addFive = (num)=> num + 5;
            if(addFive.NodeType == ExpressionType.Lambda)
            {
                var lambdaExp = (LambdaExpression)addFive;
                var parameter = lambdaExp.Parameters.First();
                Console.WriteLine(parameter.Type);
                Console.WriteLine(parameter.Name);
            }
            Console.WriteLine(addFive.Compile().Invoke(5));

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace ExpressionDemo
{
    class People
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Expression<Func<People, bool>> lambda = x => x.Id.ToString().Equals("5");
            var iResult = lambda.Compile().Invoke(new People
            {
                Id = 5,
                Age = 10,
                Name = "我"
            }) ;
            Console.WriteLine(iResult.ToString());
        }
 
    }
}

  

手动拼装表达式目录树

var one = Expression.Constant(1, typeof(int));
var two = Expression.Constant(2,typeof(int));
BinaryExpression addtion = Expression.Add(one, two);
Expression<Func<int>> expression = Expression.Lambda<Func<int>>(addtion,new ParameterExpression[] { });
Console.WriteLine(expression.Compile().Invoke());

 

            //Expression<Func<int, int, int>> expression = (m, n) => m * n + m + n + 10;
            //int iResult = expression.Compile().Invoke(10,20);

            // 拼接方式
            ParameterExpression m = Expression.Parameter(typeof(int), "m");
            ParameterExpression n = Expression.Parameter(typeof(int),"n");
            var mutiply = Expression.Multiply(m,n);
            var constant = Expression.Constant(2);
            var plus1 = Expression.Add(mutiply, m);
            var plus2 = Expression.Add(plus1,n);
            var plus3 = Expression.Add(plus2, constant);
            Expression<Func<int, int, int>> expression = Expression.Lambda<Func<int, int, int>>(plus3,new ParameterExpression[] { m, n });
            int iResult = expression.Compile().Invoke(10,20);
            Console.WriteLine(iResult);

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace ExpressionDemo
{
    class People
    {
        public int Id;
        public string Name { get; set; }
        public int Age { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            ParameterExpression parameterExpression = Expression.Parameter(typeof(People),"x");
            Expression field = Expression.Field(parameterExpression,typeof(People).GetField("Id"));
            MethodCallExpression toString = Expression.Call(field,typeof(People).GetMethod("ToString"));
            ConstantExpression constantExpression = Expression.Constant("5",typeof(string));
            MethodCallExpression equals = Expression.Call(toString, typeof(People).GetMethod("Equals"), new Expression[] { constantExpression });
            Expression<Func<People, bool>> lambda = Expression.Lambda<Func<People, bool> >(equals, new ParameterExpression[] {
                parameterExpression
             });
            var iResult = lambda.Compile().Invoke(new People()
            {
                Id = 5,
                Name = "",
                Age = 10
            }) ;
            Console.WriteLine(iResult.ToString());
        }
 
    }
}

 

posted @ 2020-02-27 18:22  bradleydan  阅读(105)  评论(0)    收藏  举报