public static class Quaryble
  
    {
  
        public static IOrderedQueryable<TSource> OrderBy<TSource>(
  
       this IEnumerable<TSource> query, string propertyName)
  
        {
  
            var entityType = typeof(TSource);
  
            var propertyInfo = entityType.GetProperty(propertyName);
  
            ParameterExpression arg = Expression.Parameter(entityType, "x");
  
            MemberExpression property = Expression.Property(arg, propertyName);
  
            var selector = Expression.Lambda(property, new ParameterExpression[] { arg });
  
            var enumarableType = typeof(System.Linq.Queryable);
  
            var method = enumarableType.GetMethods()
  
                 .Where(m => m.Name == "OrderBy" && m.IsGenericMethodDefinition)
  
                 .Where(m =>
  
                 {
  
                     var parameters = m.GetParameters().ToList();
  
                     return parameters.Count == 2;
  
                 }).Single();
  
            MethodInfo genericMethod = method
  
                 .MakeGenericMethod(entityType, propertyInfo.PropertyType);
  
            var newQuery = (IOrderedQueryable<TSource>)genericMethod
  
                 .Invoke(genericMethod, new object[] { query, selector });
  
            return newQuery;
  
        }
  
 
  
        public static IOrderedQueryable<TSource> OrderByDescending<TSource>(
  
       this IEnumerable<TSource> query, string propertyName)
  
        {
  
            var entityType = typeof(TSource);
  
            var propertyInfo = entityType.GetProperty(propertyName);
  
            ParameterExpression arg = Expression.Parameter(entityType, "x");
  
            MemberExpression property = Expression.Property(arg, propertyName);
  
            var selector = Expression.Lambda(property, new ParameterExpression[] { arg });
  
            var enumarableType = typeof(System.Linq.Queryable);
  
            var method = enumarableType.GetMethods()
  
                 .Where(m => m.Name == "OrderByDescending" && m.IsGenericMethodDefinition)
  
                 .Where(m =>
  
                 {
  
                     var parameters = m.GetParameters().ToList();
  
                     return parameters.Count == 2;
  
                 }).Single();
  
            MethodInfo genericMethod = method
  
                 .MakeGenericMethod(entityType, propertyInfo.PropertyType);
  
 
  
            var newQuery = (IOrderedQueryable<TSource>)genericMethod
  
                 .Invoke(genericMethod, new object[] { query, selector });
  
            return newQuery;
  
        }
  
    }