Me sale 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 sobre 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;
}
}
c#
.net
linq
extension-methods
compiler-errors
Tom Gullen
fuente
fuente
public static class IQueryable<T> where T : MyBaseClass
que también genera este error. Lawhere T : MyBaseClass
frase pertenece a los métodos individuales sin<T>
la clase estática.this
argumentos del método.Si no tiene la intención de tener funciones estáticas, simplemente elimine la palabra clave "this" en los argumentos.
fuente
this
palabra clave enterrada en mis firmas de método. Al eliminarlo se borró el error.Agregar palabra clave
static
a la declaración de clase:fuente
Intenta cambiar
a
fuente
Cámbialo a
fuente
Una solución alternativa para las personas que están experimentando un error como Nathan:
El compilador sobre la marcha parece tener un problema con este error de Método de extensión ... agregar
static
tampoco me ayudó.Me gustaría saber qué causa el error.
Pero la solución es escribir una nueva clase de Extensión (no anidada) incluso en el mismo archivo y volver a compilar.
Pensé que este hilo está obteniendo suficientes vistas que vale la pena transmitir (la solución limitada) que encontré. ¡La mayoría de la gente probablemente intentó agregar 'estática' antes de buscar una solución en Google! y no vi esta solución alternativa en ningún otro lado.
fuente
El método de extensión debe estar dentro de una clase estática. Entonces, agregue su método de extensión dentro de una clase estática.
así, por ejemplo, debería ser así
fuente
Intente cambiarlo a clase estática y viceversa. Eso podría resolver las quejas de Visual Studio cuando es un falso positivo.
fuente
Encontré un problema similar, creé una carpeta 'foo' y creé una "clase" dentro de foo, luego recibí el error antes mencionado. Una solución es agregar "estática" como se mencionó anteriormente a la clase que será "clase estática pública LinqHelper".
Mi suposición es que cuando crea una clase dentro de la carpeta foo la considera como una clase de extensión, por lo tanto, se aplica la siguiente regla, entre otras:
1) Cada método de extensión debe ser un método estático
Propocionar comentarios Solución Si no desea estática. Mi solución era crear una clase directamente debajo del espacio de nombres y luego arrastrarla a la carpeta "foo".
fuente