una non método must metodo method genérica generic extensión extensions extension example estática definirse definicion debe create clase c# .net linq extension-methods compiler-errors

c# - non - Los métodos de extensión deben definirse en una clase estática no genérica



metodo de extension definicion (7)

Agregar palabra clave static a declaración de clase:

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

Me aparece 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 de ayuda, basada en el código de Mark Gavells. ¡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; } }


Cambiarlo a

public static class LinqHelper


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í que por ejemplo 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; } }


Intenta cambiar

public class LinqHelper

a

public static class LinqHelper


Intenta cambiarlo a clase estática y viceversa. Eso podría resolver la queja del estudio visual cuando es un falso positivo.


Una solución 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 alternativa es escribir una nueva clase de extensión (no anidada) incluso en el mismo archivo y volver a compilar.

Supuse que este hilo está recibiendo suficientes vistas que vale la pena transmitir (la solución limitada) 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.


cambio

public class LinqHelper

a

public static class LinqHelper

Se deben tener en cuenta los siguientes puntos al crear 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 ser un método static
  3. El primer parámetro del método de extensión debe usar la palabra clave this .