protected virtual MethodCallExpression Visit(ExecuteFilterExp execExp) { AccessInfo info = new AccessInfo(); var stack = new Stack <Tuple <string, Type> >(); Visit(execExp.GetfieldExp, stack, info); var accessFieldExp = info.exp; if (info.FieldType != stack.Peek().Item2) { throw new Exception(); } if (!info.FieldType.IsGenericType || !(info.FieldType.GetGenericTypeDefinition() == typeof(List <>))) { throw new Exception(); } var method = Visit(execExp.FilterExp, info.FieldType.GetGenericArguments()[0]); var thisLoopMethodInfo = loopMethodInfo.MakeGenericMethod(info.FieldType.GetGenericArguments()[0]); var exp = Expression.Call(thisLoopMethodInfo, accessFieldExp, Expression.Constant(method)); var tempDelegate = Expression.Lambda(exp, rootParam.Peek()).Compile(); var methodwar = typeof(Template).GetMethod(nameof(Template.F)); var realMethodWar = methodwar.MakeGenericMethod(rootParam.Peek().Type); return(Expression.Call(realMethodWar, rootParam.Peek(), Expression.Constant(tempDelegate))); }
protected virtual void Visit(ExecuteFilterExp execExp) { Visit(execExp.GetfieldExp); Visit(execExp.FilterExp); }