示例#1
0
        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);
 }