Методы расширения должны быть определены в неуниверсальных статический класс



Я получаю сообщение об ошибке:




методы расширения должны быть определены в неуниверсальных статический класс




в строке:



public class LinqHelper


вот вспомогательный класс, основанный на коде Марка Гавелса. Я действительно смущен тем, что означает эта ошибка, поскольку я уверен, что он работал нормально, когда я оставил его в пятницу!



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

8 ответов:

изменить

public class LinqHelper

до

public static class LinqHelper

при создании метода расширения необходимо учитывать следующие моменты:

  1. класс, определяющий метод расширения, должен быть non-generic,static и non-nested
  2. каждый метод расширения должен быть static метод
  3. первый параметр метода расширения должен использовать this ключевое слово.

добавить ключевое слово static в объявлении класса:

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

изменить на

public static class LinqHelper

попробуйте изменить

public class LinqHelper

до

 public static class LinqHelper

работа вокруг для людей, которые испытывают ошибку, как Натан:

компилятор на лету, похоже, имеет проблему с этой ошибкой метода расширения... добавление static не помогло.

Я хотел бы знать, что вызывает ошибку?

но работающим это написать новый класс расширения (не вложенный) даже в том же файле и перестроить.

понял, что этот поток получает достаточно просмотров, которые стоит передать (ограниченное) решение я нашел. Большинство людей, вероятно, пытались добавить "статический" перед google-ing для решения! и я больше нигде не видел этого обходного решения.

метод расширения должен быть внутри статического класса. Поэтому, пожалуйста, добавьте свой метод расширения внутри статического класса.

Так, например, это должно быть так

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

    }

попробуйте изменить его в статический класс и обратно. Это может решить visual studio жаловаться, когда это ложное срабатывание.

Если вы не собираетесь иметь статические функции, просто избавьтесь от ключевого слова "this" в аргументах.

Comments

    Ничего не найдено.