| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 | using System;using System.Linq;using System.Linq.Expressions;namespace InABox.Core{    internal class ParameterReplacer : ExpressionVisitor    {        private readonly ParameterExpression _parameter;        internal ParameterReplacer(ParameterExpression parameter)        {            _parameter = parameter;        }        protected override Expression VisitParameter(ParameterExpression node)        {            return base.VisitParameter(_parameter);        }    }    public static class IQueryableExtensions    {        public static IOrderedQueryable<T> SortBy<T>(this IQueryable<T> source, Expression property)        {            return source.OrderBy(ToLambda<T>(property));        }        public static IOrderedQueryable<T> SortByDescending<T>(this IQueryable<T> source, Expression property)        {            return source.OrderByDescending(ToLambda<T>(property));        }        public static Expression<Func<T, object>> ToLambda<T>(Expression property)        {            //var type = typeof(T);            //var body = property;            //var parameter = Expression.Parameter(type,"x");            //var delegateType = typeof(Func<,>).MakeGenericType(type, typeof(Object));            //dynamic lambda = Expression.Lambda(delegateType, body, parameter);            //dynamic comp = lambda.Compile();            //return comp;            var paramExpr = Expression.Parameter(typeof(T));            var exprBody = Expression.Convert(property, typeof(object));            var replBody = new ParameterReplacer(paramExpr).Visit(exprBody);            var finalExpr = Expression.Lambda<Func<T, object>>(replBody, paramExpr);            return finalExpr;        }    }}
 |