2011-05-23 12 views
143

estoy recibiendo el error:métodos de extensión deben ser definidos en una clase estática no genérico

Extension methods must be defined in a non-generic static class

En la línea:

public class LinqHelper 

Esta es la clase de ayuda, basado en Marcos Gavells código. ¡Realmente estoy 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; 
    } 
} 

Respuesta

226

cambio

public class LinqHelper 

a

public static class LinqHelper 

siguientes puntos deben ser considerados cuando se crea un método de extensión:

  1. La clase que define un método de extensión debe ser non-generic, static y non-nested
  2. Cada método de extensión debe haber un método static
  3. El primer parámetro del método de extensión debe utilizar la palabra clave this.
+1

también añadir * no anidados * en el primer punto. – nawfal

+0

Si ha colocado la clase en App_Code, es probable que tenga la palabra clave static en la definición de la clase, pero si la coloca en cualquier otra carpeta, está bien usarla como clase normal. –

+0

En un caso, he usado 'public static class IQueryable donde T: MyBaseClass' que también genera este error. La frase 'where T: MyBaseClass' pertenece a los métodos individuales sin' 'en la clase estática. –

21

Agregar palabra clave static a declaración de la clase:

// this is a non-generic static class 
public static class LinqHelper 
{ 
} 
16

cambiarlo a

public static class LinqHelper 
14

intente cambiar

public class LinqHelper 

a

public static class LinqHelper 
5

Una solución alternativa para las personas que están pasando por un error como Nathan:

El sobre la marcha compilador parece tener un problema con este error Método de extensión ... añadiendo static no ayudó yo tampoco.

Me gustaría saber qué causa el error?

Pero el work-around es escribir una nueva clase de extensión (no anidada) incluso en el mismo archivo y volver a compilar.

imaginó que este tema está recibiendo suficientes puntos de vista que vale la pena transmitir (la limitada) solución que encontré. ¡La mayoría de la gente probablemente intentó agregar 'estático' antes de buscar una solución en google! y no vi esta solución de reparación en ningún otro lado.

+0

Tuve el mismo problema. Me di cuenta de que agregué una función estática dentro de la clase y olvidé comentarlo. Entonces eso hizo que mi clase quedara estática, y por lo tanto estaba dando este error. Verifica si hay objetos estáticos en tu clase. – Mahesh

0

El método de extensión debe estar dentro de una clase estática. Por lo tanto, agregue su método de extensión dentro de una clase estática.

así por ejemplo que debería ser así

public static class myclass 
    { 
     public static Byte[] ToByteArray(this Stream stream) 
     { 
      Int32 length = stream.Length > Int32.MaxValue ? Int32.MaxValue : Convert.ToInt32(stream.Length); 
      Byte[] buffer = new Byte[length]; 
      stream.Read(buffer, 0, length); 
      return buffer; 
     } 

    } 
-1

pruebe a cambiar a la clase estática y la espalda. Eso podría resolver la queja del estudio visual cuando es un falso positivo.

-1

Funcionó bien cuando lo dejó el viernes, pero ¿qué pasó? Porque alguien (o tal vez usted) agregó this.

Si no desea convertir la clase a static, puede eliminar this de la declaración del método.

Por ejemplo:

public static IOrderedQueryable<T> OrderBy<T>([delete ->]this[<- /delete] IQueryable<T> source, string property) 
    { 
     return ApplyOrder<T>(source, property, "OrderBy"); 
    } 
Cuestiones relacionadas