Awzh Circulate 2022-12-28 11:52 采纳率: 100%
浏览 16
已结题

Expression

//问题描述 我想写一个递归 是刚刚看了作者的文章 试着写一下 但是调用时 出现了问题 代码如下

 People PeopleModels = new People() { 
            ID="12345",
            Name="father",
            ParentID="",
                Child=new People[1]{
                    new People(){           
                    ID="12",
                    Name="erzi12",
                    ParentID="123456",
                    Child=null
                    } 
                }
            };
            Func<People, List<People>> ListPeople = null;
            Expression<Func<People, List<People>>> ListFuncExp = i => ListPeople(i);
            ParameterExpression parameter = Expression.Parameter(typeof(People), "Models");
            var DiGui = Expression.Lambda<Func<People, List<People>>>(
                Expression.Block(
                    new ParameterExpression[] { parameter },//var Models;
                    Expression.Assign(parameter, Expression.Constant(PeopleModels)),//Models=PeopleModels
                    Expression.IfThenElse(//if
                        Expression.AndAlso(//Models.ParentID=="" && Models.Child.Length==0
                            Expression.Equal(
                            Expression.MakeMemberAccess(parameter, typeof(People).GetProperty("ParentID")),
                            Expression.Constant("")),
                            //========================
                            Expression.Equal(
                            Expression.ArrayLength(Expression.MakeMemberAccess(parameter, typeof(People).GetProperty("Child"))),
                            Expression.Constant(0))
                        ),
                        Expression.Block(//iftrue Console.WriteLine(new List<People>(){Models})
                            Expression.Call(null, typeof(Console).GetMethod("WriteLine", new[] { typeof(List<People>) }),
                                Expression.ListInit(
                                    Expression.New(//new List<People>(){}
                                       typeof(List<People>).GetConstructor(new Type[0])),
                                       Expression.ElementInit(typeof(List<People>).GetMethod("Add"),parameter
                                    )
                                )
                            )
                        ), 
                        //else
                        Expression.Invoke(ListFuncExp, parameter)//调用ListFuncExp(parameter)
                        ), Expression.Invoke(ListFuncExp, parameter)
                    ),new ParameterExpression[] { parameter }
                 );
            var resultDiguis = DiGui.Compile();
            //问题 这里如果调用resultDiguis(PeopleModels) 会报错 未将对象引用到对象的实例???
            Console.WriteLine("结果:{0}", resultDiguis);

  • 写回答

2条回答 默认 最新

  • |__WhoAmI__| 2022-12-28 12:01
    关注

    PeopleModels 变量在定义时赋予了一个 People 对象,但是在后面的代码中,又定义了一个同名的参数 parameter,导致了变量重复定义的错误。
    People 类中的 Child 属性是一个 People 数组,但是在给 Child 赋值时使用了 new People[1] 这种语法,这是错误的。正确的写法应该是 new People[]{...}。
    在 Lambda 表达式的 Body 中,调用 Console.WriteLine 方法时使用了错误的语法。应该使用 Expression.Call 方法来调用方法。
    如果要实现递归的效果,就需要在调用自身的时候传入当前要遍历的对象,而代码中并没有这么做。
    望采纳。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月5日
  • 已采纳回答 12月28日
  • 创建了问题 12月28日

悬赏问题

  • ¥15 用土力学知识进行土坡稳定性分析与挡土墙设计
  • ¥70 PlayWright在Java上连接CDP关联本地Chrome启动失败,貌似是Windows端口转发问题
  • ¥15 帮我写一个c++工程
  • ¥30 Eclipse官网打不开,官网首页进不去,显示无法访问此页面,求解决方法
  • ¥15 关于smbclient 库的使用
  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?