251 votes

Les méthodes d'extension doivent être définies dans une classe statique non générique.

Je reçois l'erreur :

Les méthodes d'extension doivent être définies dans une classe statique non générique.

Sur la ligne :

public class LinqHelper

Voici la classe d'aide, basée sur le code de Mark Gavells. Je suis vraiment confus quant à la signification de cette erreur, car je suis sûr que cela fonctionnait bien quand je l'ai laissé vendredi !

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;
    }
}

356voto

Int3 ὰ Points 4254

Changement

public class LinqHelper

à

public static class LinqHelper

Les points suivants doivent être pris en compte lors de la création d'une méthode d'extension :

  1. La classe qui définit une méthode d'extension doit être non-generic , static y non-nested
  2. Chaque méthode d'extension doit être un static méthode
  3. Le premier paramètre de la méthode d'extension doit utiliser l'attribut this mot-clé.

0 votes

Si vous avez placé la classe dans App_Code, alors elle est obligée d'avoir le mot clé static dans la définition de la classe, mais si vous la placez dans un autre dossier, vous pouvez l'utiliser comme une classe normale.

1 votes

Dans un cas, j'avais utilisé public static class IQueryable<T> where T : MyBaseClass qui génère également cette erreur. Le site where T : MyBaseClass la phrase appartient aux méthodes individuelles sans <T> sur la classe statique.

1 votes

Mais que se passe-t-il si le cours est partiel ? Cette solution n'a pas fonctionné pour moi.

22voto

abatishchev Points 42425

Ajouter un mot-clé static à la déclaration de la classe :

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

20voto

Stephan Luis Points 115

Une solution de contournement pour les personnes qui rencontrent un bug comme Nathan :

Le compilateur à la volée semble avoir un problème avec cette erreur de méthode d'extension... en ajoutant static ne m'a pas aidé non plus.

J'aimerais savoir ce qui cause le bug ?

Mais la solution de contournement est d'écrire une nouvelle classe d'extension (non imbriquée) même dans le même fichier et de reconstruire.

J'ai pensé que ce fil de discussion recevait suffisamment de visites pour que cela vaille la peine de transmettre la solution (limitée) que j'ai trouvée. La plupart des gens ont probablement essayé d'ajouter 'static' avant de chercher une solution sur Google ! et je n'ai pas vu cette solution de contournement ailleurs.

1 votes

J'ai eu le même problème. Je viens de réaliser que j'ai ajouté une fonction statique dans la classe et que j'ai oublié de la commenter. Cela a rendu ma classe statique, et a donc donné cette erreur. Vérifiez s'il y a des objets statiques dans votre classe.

18voto

Nathan Points 3564

Essayez de changer

public class LinqHelper

à

 public static class LinqHelper

15voto

Rik Points 12802

Changez-le en

public static class LinqHelper

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X