Los métodos de extensión deben definirse en una clase estática no genérica
Recibo el error:
Los métodos de extensión deben definirse en una clase estática no genérica
En la línea:
public class LinqHelper
Aquí está la clase auxiliar, basada en el código de Mark Gavells. Estoy realmente confundido en cuanto a lo que significa este error, ya que estoy seguro de que estaba funcionando bien cuando lo dejé el viernes.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Linq.Expressions;
using System.Reflection;
/// <summary>
/// Helper methods for link
/// </summary>
public class LinqHelper
{
public static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> source, string property)
{
return ApplyOrder<T>(source, property, "OrderBy");
}
public static IOrderedQueryable<T> OrderByDescending<T>(this IQueryable<T> source, string property)
{
return ApplyOrder<T>(source, property, "OrderByDescending");
}
public static IOrderedQueryable<T> ThenBy<T>(this IOrderedQueryable<T> source, string property)
{
return ApplyOrder<T>(source, property, "ThenBy");
}
public static IOrderedQueryable<T> ThenByDescending<T>(this IOrderedQueryable<T> source, string property)
{
return ApplyOrder<T>(source, property, "ThenByDescending");
}
static IOrderedQueryable<T> ApplyOrder<T>(IQueryable<T> source, string property, string methodName)
{
string[] props = property.Split('.');
Type type = typeof(T);
ParameterExpression arg = Expression.Parameter(type, "x");
Expression expr = arg;
foreach (string prop in props)
{
// use reflection (not ComponentModel) to mirror LINQ
PropertyInfo pi = type.GetProperty(prop);
expr = Expression.Property(expr, pi);
type = pi.PropertyType;
}
Type delegateType = typeof(Func<,>).MakeGenericType(typeof(T), type);
LambdaExpression lambda = Expression.Lambda(delegateType, expr, arg);
object result = typeof(Queryable).GetMethods().Single(
method => method.Name == methodName
&& method.IsGenericMethodDefinition
&& method.GetGenericArguments().Length == 2
&& method.GetParameters().Length == 2)
.MakeGenericMethod(typeof(T), type)
.Invoke(null, new object[] { source, lambda });
return (IOrderedQueryable<T>)result;
}
}
Aceptado
cambiar
public class LinqHelper
a
public static class LinqHelper
Es necesario considerar los siguientes puntos al crear un método de extensión:
- La clase que define un método de extensión debe ser
non-generic
ystatic
non-nested
- Cada método de extensión debe ser un
static
método. - El primer parámetro del método de extensión debe utilizar la
this
palabra clave.
Si no tiene intención de tener funciones estáticas, simplemente elimine la palabra clave "this" en los argumentos.
Agregue una palabra clave static
a la declaración de clase:
// this is a non-generic static class
public static class LinqHelper
{
}