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 Mark Gavells. Je suis vraiment confus quant à ce que signifie cette erreur car je suis sûr qu'elle fonctionnait bien quand je l'ai quitté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;
}
}
c#
.net
linq
extension-methods
compiler-errors
Tom Gullen
la source
la source
public static class IQueryable<T> where T : MyBaseClass
ce qui génère également cette erreur. Lawhere T : MyBaseClass
phrase appartient aux méthodes individuelles sans<T>
à la classe statique.this
arguments de méthode.si vous n'avez pas l'intention d'avoir des fonctions statiques, supprimez simplement le mot-clé "this" dans les arguments.
la source
this
mot - clé enfoui dans ma signature de méthode. Le supprimer a effacé l'erreur.Ajouter un mot clé
static
à la déclaration de classe:la source
Essayez de changer
à
la source
Changez-le en
la source
Une solution de contournement pour les personnes qui connaissent un bug comme Nathan:
Le compilateur à la volée semble avoir un problème avec cette erreur de méthode d'extension ... l'ajout
static
ne m'a pas aidé non plus.Je voudrais savoir ce qui cause le bogue?
Mais la solution consiste à écrire une nouvelle classe d'extension (non imbriquée) même dans le même fichier et à reconstruire.
J'ai pensé que ce fil obtenait suffisamment de vues qu'il valait 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 rechercher une solution sur Google! et je n'ai vu cette solution de contournement nulle part ailleurs.
la source
La méthode d'extension doit se trouver dans une classe statique. Veuillez donc ajouter votre méthode d'extension dans une classe statique.
donc, par exemple, il devrait être comme ça
la source
Essayez de le changer en classe statique et inversement. Cela pourrait résoudre les plaintes de Visual Studio lorsqu'il s'agit d'un faux positif.
la source
J'ai rencontré un problème similaire, j'ai créé un dossier 'foo' et créé une "classe" à l'intérieur de foo, puis j'ai l'erreur susmentionnée. Un correctif consiste à ajouter "statique" comme mentionné précédemment à la classe qui sera "classe statique publique LinqHelper".
Mon hypothèse est que lorsque vous créez une classe dans le dossier foo, elle la considère comme une classe d'extension, d'où la règle, entre autres, qui lui est applicable:
1) Chaque méthode d'extension doit être une méthode statique
SOLUTION Si vous ne voulez pas d'électricité statique. Ma solution de contournement consistait à créer une classe directement sous l'espace de noms, puis à la faire glisser vers le dossier "foo".
la source