• 将一个类的Lambda转换成另一个类的研究


    首先是2个相同的类

    class ClassA
        {
            public int Id { get; set; }
    
            public string Name { get; set; }
        }
    
        class ClassB
        {
            public int Id { get; set; }
    
            public string Name { get; set; }
        }

    然后自定义访问者,将  ParameterExpression全部换成另一个类的  

    public class MyVisitor<SourceT,DescT> : ExpressionVisitor
        {
            private readonly ParameterExpression DescTParameter = Expression.Parameter(typeof(DescT), "p");
    
            protected override Expression VisitParameter(ParameterExpression node)
            {
                if (node.Type == typeof(SourceT))
                {
                    return DescTParameter;
                }
                return base.VisitParameter(node);
            }
    
    
            protected override Expression VisitMember(MemberExpression node)
            {
                if (node.Member.ReflectedType == typeof(SourceT))
                {
                    var idExpression = Expression.Property(DescTParameter, node.Member.Name);
                    return idExpression;
                }
                return base.VisitMember(node);
            }
    
            public Expression<Func<DescT, bool>> Modify(Expression<Func<SourceT, bool>> expression)
            {
                var result = this.Visit(expression.Body);
                return Expression.Lambda<Func<DescT, bool>>(result, DescTParameter);
            }
    
        }
    

    调用代码如下:

        var classAList = new List<ClassA>
                                     {
                                                  new ClassA {Id = 1, Name = "User1"},
                                                  new ClassA {Id = 2, Name = "User2"}
                                              };
                Expression<Func<ClassB, bool>> expressionB =
                    p => p.Id > 1 && p.Name == "User2";
    
    MyVisitor<ClassB,ClassA> visitor =new MyVisitor<ClassB, ClassA>(); var ex = visitor.Modify(expressionB); var result = classAList.AsQueryable().Where(ex); foreach (var item in result) { Console.WriteLine(item.Name); }

  • 相关阅读:
    线程同步总结
    Map,HashMap,LinkedHashMap,TreeMap比较和理解
    实现自定义注解
    SSM框架中写sql在dao文件中以注解的方式
    SSM框架中写sql在xml文件中
    自由创蚁-青少年积木式编程平台正式发布了!
    回调函数
    全面理解Javascript闭包和闭包的几种写法及用途
    hover伪类
    添加背景音乐
  • 原文地址:https://www.cnblogs.com/kiminozo/p/2125272.html
Copyright © 2020-2023  润新知