C# VisitMethodCall不访问每个部分
我有一个表达式访问者将表达式转换为url格式。但它只转换最后调用的表达式。例如,如果我这样调用我的集合:C# VisitMethodCall不访问每个部分,c#,linq,iqueryable,C#,Linq,Iqueryable,我有一个表达式访问者将表达式转换为url格式。但它只转换最后调用的表达式。例如,如果我这样调用我的集合: NetworkAccountStorage.Where<NetworkAccountModel>(x => x.ID + 1 > 0).Select(x => x.Name).Distinct() 你需要递归。Distinct接受一个参数,该参数是.Select call等。您需要递归。Distinct接受一个这个参数,它是.Select call等。您需要通
NetworkAccountStorage.Where<NetworkAccountModel>(x => x.ID + 1 > 0).Select(x => x.Name).Distinct()
你需要递归。Distinct接受一个
参数,该参数是.Select call等。您需要递归。Distinct接受一个这个参数,它是.Select call等。您需要通过调用覆盖的基本方法来递归:
base.VisitMethodCall(...);
您需要通过调用覆盖的基方法进行递归:
base.VisitMethodCall(...);
但是什么属性必须递归呢?绑定到Distinct的第一个参数的表达式。可悲的是,我没有任何榜样,也没有时间让别人发现它。我刚刚访问了Arguments[0]@Marcklein我建议您不要手动访问所有内容。看看我的答案。这对你来说是自动化的。但是什么属性必须递归呢?绑定到Distinct的第一个参数的表达式。可悲的是,我没有任何榜样,也没有时间让别人发现它。我刚刚访问了Arguments[0]@Marcklein我建议您不要手动访问所有内容。看看我的答案。这东西是自动为你准备的,你认为这是正确的吗?m=m.Update(m.Object,m.Arguments);返回基。访问方法调用(m);修改m没有效果-它是一个局部变量(一个参数)。这是你的私人副本。试试这个(如果它不能立即工作,您需要以某种方式修复它):返回m.Update(base.Visit(m.Object),m.Arguments.Select(x=>base.Visit(x))代码>。不确定您称之为更新的原因,但它一定有原因。所以您认为这是正确的吗?m=m.Update(m.Object,m.Arguments);返回基。访问方法调用(m);修改m没有效果-它是一个局部变量(一个参数)。这是你的私人副本。试试这个(如果它不能立即工作,您需要以某种方式修复它):返回m.Update(base.Visit(m.Object),m.Arguments.Select(x=>base.Visit(x))代码>。不确定您称之为更新的原因,但必须有原因。