web-dev-qa-db-fra.com

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'assistance basée sur le code de Mark Gavells. Je suis vraiment confus quant à la signification de cette erreur car je suis sûr que tout fonctionnait bien lorsque je l'ai laissée 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;
    }
}
176
Tom Gullen

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 êtrenon-generic, static et non-nested
  2. Chaque méthode d'extension doit être une méthode static
  3. Le premier paramètre de la méthode d'extension doit utiliser le mot clé this
266
crypted

Ajoutez le mot clé static à la déclaration de classe:

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

Le changer en

public static class LinqHelper
16
Rik

Essayez de changer 

public class LinqHelper

à

 public static class LinqHelper
16
Nathan

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

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

J'aimerais savoir ce qui cause le bogue?

Mais la solution de contournement consiste à écrire une nouvelle classe Extension (non imbriquée) même dans le même fichier et à la reconstruire.

J'ai pensé que ce fil recevait suffisamment de points de vue 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 «statique» avant de chercher une solution sur Google! et je n'ai vu cette solution de contournement nulle part ailleurs.

9
Stephan Luis

si vous n'avez pas l'intention d'avoir des fonctions statiques, supprimez simplement le mot clé "this" dans les arguments.

4
Rohan Bhosale

La méthode d'extension doit être à l'intérieur d'une classe statique . Ajoutez donc votre méthode d'extension à l'intérieur d'une classe statique.

ainsi, par exemple, il devrait être comme ça

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

    }
2
Debendra Dash

Essayez de le changer en classe statique et retour. Cela pourrait résoudre le problème de visual studio en se plaignant lorsqu'il s'agit d'un faux positif.

0
visc