Estou recebendo o erro:
Os métodos de extensão devem ser definidos em uma classe estática não genérica
Na linha:
public class LinqHelper
Aqui está a classe auxiliar, baseada no código de Mark Gavells. Estou realmente confuso sobre o que esse erro significa, pois tenho certeza que estava funcionando bem quando o deixei na sexta-feira!
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
fonte
fonte
public static class IQueryable<T> where T : MyBaseClass
que também gera esse erro. Awhere T : MyBaseClass
frase pertence aos métodos individuais sem<T>
na classe estática.this
argumentos do método.se você não pretende ter funções estáticas, livre-se da palavra-chave "this" nos argumentos.
fonte
this
palavra - chave enterrada em minhas assinaturas de método. A remoção limpou o erro.Adicione a palavra
static
- chave à declaração de classe:fonte
Tente mudar
para
fonte
Mude para
fonte
Uma solução alternativa para pessoas que estão enfrentando um erro como Nathan:
O compilador on-the-fly parece ter um problema com este erro do método de extensão ... a adição
static
também não me ajudou.Gostaria de saber o que causa o erro?
Mas a solução alternativa é escrever uma nova classe de extensão (não aninhada), mesmo no mesmo arquivo e recriar.
Percebi que esse segmento está obtendo visualizações suficientes para que valha a pena passar (a solução limitada) que encontrei. A maioria das pessoas provavelmente tentou adicionar 'estático' antes do google para obter uma solução! e não vi essa solução alternativa em nenhum outro lugar.
fonte
O método de extensão deve estar dentro de uma classe estática. Portanto, adicione seu método de extensão dentro de uma classe estática.
por exemplo, deve ser assim
fonte
Tente alterá-lo para classe estática e vice-versa. Isso pode resolver as reclamações do visual studio quando se trata de um falso positivo.
fonte
Eu encontrei um problema semelhante, criei uma pasta 'foo' e criei uma "classe" dentro de foo. Em seguida, recebo o erro mencionado acima. Uma correção é adicionar "estático", como mencionado anteriormente à classe, que será "classe estática pública LinqHelper".
Minha suposição é que, quando você cria uma classe dentro da pasta foo, ela a considera uma classe de extensão, portanto, a seguinte regra se aplica a ela:
1) Todo método de extensão deve ser um método estático
SOLUÇÃO ALTERNATIVA Se você não quiser estática. Minha solução alternativa foi criar uma classe diretamente sob o espaço para nome e arraste-a para a pasta "foo".
fonte