Методы расширения должны быть определены в неуниверсальных статический класс
Я получаю сообщение об ошибке:
методы расширения должны быть определены в неуниверсальных статический класс
в строке:
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;
}
}
8 ответов:
изменить
public class LinqHelperдо
public static class LinqHelperпри создании метода расширения необходимо учитывать следующие моменты:
- класс, определяющий метод расширения, должен быть
non-generic,staticиnon-nested- каждый метод расширения должен быть
staticметод- первый параметр метода расширения должен использовать
thisключевое слово.
добавить ключевое слово
staticв объявлении класса:// this is a non-generic static class 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