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;
}
}
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:
non-generic
, static
et non-nested
static
this
. Ajoutez le mot clé static
à la déclaration de classe:
// this is a non-generic static class
public static class LinqHelper
{
}
Le changer en
public static class LinqHelper
Essayez de changer
public class LinqHelper
à
public static class LinqHelper
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.
si vous n'avez pas l'intention d'avoir des fonctions statiques, supprimez simplement le mot clé "this" dans les arguments.
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;
}
}
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.