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 } )); }
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)); }