Beispiel #1
0
        public override Expression Visit(Expression node)
        {
            if (node != null)
            {
                var snExpr = _expressions[node];
                if (snExpr.IsExecutable)
                {
                    if (node.NodeType == ExpressionType.Constant)
                    {
                        return(node);
                    }

                    var x = DynamicExpression.Lambda(node);
                    var y = x.Compile();
                    var z = y.DynamicInvoke();
                    return(Expression.Constant(z));
                }
            }
            return(base.Visit(node));
        }
        public static IHtmlContent EditorFor <TModel>(
            this HtmlHelper <TModel> htmlHelper,
            object instance,
            string expression)
        {
            var tType = instance.GetType();

            //TModel = typeof(instance);
            htmlHelper.ViewContext.ViewData.Model = instance;
            var lambda = DynamicExpression.Lambda(Expression.Property(Expression.Parameter(tType, "m"), expression));

            var methods = typeof(HtmlHelper).GetMethods();

            var method = methods.Where(x =>
            {
                var args  = x.GetGenericArguments();
                var parms = x.GetParameters();

                return(args.Count() == 2 &&
                       args[0].Name == "TModel" &&
                       args[1].Name == "TValue" &&
                       x.Name == "EditorFor" &&
                       parms.Count() == 2 &&
                       parms[0].ParameterType.Name == "HtmlHelper`1" &&
                       parms[1].ParameterType.Name == "Expression`1");
            }).First();

            method = method.MakeGenericMethod(new[] { tType, lambda.Body.Type });

            var htmlHelperType = typeof(HtmlHelper <>)
                                 .MakeGenericType(tType);

            var helper = htmlHelper;

            return((IHtmlContent)method.Invoke(
                       helper,
                       new object[] { helper, lambda }
                       ));
        }
Beispiel #3
0
        private static IQueryable ExpandQueryableOrderBy(IQueryable source, string[] statements)
        {
            var expression = source.Expression;
            var parameter  = Expression.Parameter(source.ElementType, String.Empty);

            for (int idx = 0; idx < statements.Length; idx++)
            {
                bool isAscending = true;
                // Try LINQ ascending/descending suffix
                string memberReference = ParseStatement(statements[idx], out isAscending);
                bool   isFirstOrderBy  = (idx == 0);

                var methodName = (isFirstOrderBy ? "OrderBy" : "ThenBy") + (isAscending ? String.Empty : "Descending");

                // Unravel nested property accesses
                var        memberElements   = memberReference.Split('.');
                Expression memberExpression = parameter;
                foreach (string memberElement in memberElements)
                {
                    if (string.IsNullOrEmpty(memberElement))
                    {
                        throw new ArgumentException(Strings.EntityDataSourceView_EmptyPropertyName);
                    }
                    memberExpression = Expression.Property(memberExpression, memberElement.Trim());
                }

                expression = Expression.Call(typeof(Queryable), methodName, new Type[] { source.ElementType, memberExpression.Type },
                                             new Expression[] { expression, Expression.Quote(DynamicExpression.Lambda(memberExpression, parameter)) });
            }

            return(source.Provider.CreateQuery(expression));
        }