Método de extensión de IQueryable no funciona

¿Cómo puedo hacer un método de extensión que funcione así?

public static class Extensions { public static IQueryable Sort(this IQueryable query, string sortField, SortDirection direction) { // System.Type dataSourceType = query.GetType(); //System.Type dataItemType = typeof(object); //if (dataSourceType.HasElementType) //{ // dataItemType = dataSourceType.GetElementType(); //} //else if (dataSourceType.IsGenericType) //{ // dataItemType = dataSourceType.GetGenericArguments()[0]; //} //var fieldType = dataItemType.GetProperty(sortField); if (direction == SortDirection.Ascending) return query.OrderBy(s => s.GetType().GetProperty(sortField)); return query.OrderByDescending(s => s.GetType().GetProperty(sortField)); } } 

Actualmente dice “Los métodos de extensión deben definirse en una clase estática no genérica”.

¿Cómo hago esto?

Intenta esto … (pero no estoy seguro de que hará lo que quieres)

 public static class Extensions { public static IQueryable Sort(this IQueryable query, string sortField, SortDirection direction) { if (direction == SortDirection.Ascending) return query.OrderBy(s => s.GetType() .GetProperty(sortField)); return query.OrderByDescending(s => s.GetType() .GetProperty(sortField)); } } 

… El parámetro genérico debe estar en el método y no en la clase. Moviéndolo de Extensions a Sort( le permitiría deshacerse del error del comstackdor que está teniendo.

En cuanto a lo que intenta hacer con la reflexión, estaría devolviendo un objeto PropertyInfo para la cláusula orderby. Es muy probable que esto no sea compatible con el árbol de expresiones que desea. Es posible que desee mirar Dynamic LINQ .

… este es un extracto de Dynamic LINQ .

 public static IQueryable OrderBy(this IQueryable source, string ordering, params object[] values) { if (source == null) throw new ArgumentNullException("source"); if (ordering == null) throw new ArgumentNullException("ordering"); ParameterExpression[] parameters = new ParameterExpression[] { Expression.Parameter(source.ElementType, "") }; ExpressionParser parser = new ExpressionParser(parameters, ordering, values); IEnumerable orderings = parser.ParseOrdering(); Expression queryExpr = source.Expression; string methodAsc = "OrderBy"; string methodDesc = "OrderByDescending"; foreach (DynamicOrdering o in orderings) { queryExpr = Expression.Call( typeof(Queryable), o.Ascending ? methodAsc : methodDesc, new Type[] { source.ElementType, o.Selector.Type }, queryExpr, Expression.Quote(Expression.Lambda(o.Selector, parameters))); methodAsc = "ThenBy"; methodDesc = "ThenByDescending"; } return source.Provider.CreateQuery(queryExpr); } 

Cambia esto:

 public static class Extensions { public static IQueryable Sort(this IQueryable query, string sortField, SortDirection direction) { //code } } 

La clase debe ser no genérica, solo su método de extensión debe ser 🙂

El error ya te dice:

Los métodos de extensión se deben definir en una clase estática no genérica .

Simplemente quite el argumento de tipo genérico.

 public static class Extensions // no  { // ... }