IQueryable <T> Дополнительный Метод, не работающий

Как я могу сделать дополнительный метод, который будет работать как это

public static class Extensions<T>
{
    public static IQueryable<T> Sort(this IQueryable<T> query, string sortField, SortDirection direction)
    {
        // System.Type dataSourceType = query.GetType();

        //System.Type dataItemType = typeof(object);

        //if (dataSourceType.HasElementType)
        //{
        //    dataItemType = dataSourceType.GetElementType();
        //}
        //else if (dataSourceType.IsGenericType)
        //{
        //    dataItemType = dataSourceType.GetGenericArguments()[0];
        //}

        //var fieldType = dataItemType.GetProperty(sortField);
        if (direction == SortDirection.Ascending)
            return query.OrderBy(s => s.GetType().GetProperty(sortField));
        return query.OrderByDescending(s => s.GetType().GetProperty(sortField));

    }
}

В настоящее время это говорит, что "Дополнительные методы должны быть определены в неуниверсальном статическом классе".

Как я делаю это?

5
задан Micah 1 April 2010 в 18:32
поделиться

3 ответа

Попробуйте это ... (но я не уверен, что он будет делать то, что вы хотите.)

public static class Extensions
{ 
    public static IQueryable<T> Sort<T>(this IQueryable<T> query, 
                                             string sortField, 
                                             SortDirection direction) 
    { 
        if (direction == SortDirection.Ascending) 
            return query.OrderBy(s => s.GetType()
                                       .GetProperty(sortField)); 
        return query.OrderByDescending(s => s.GetType()
                                             .GetProperty(sortField)); 

    } 
} 

... Общий параметр должен быть в методе, а не в классе. Перемещение его из Extensions в Sort ( позволит вам избавиться от возникшей ошибки компилятора.

Что касается того, что вы пытаетесь сделать с отражением вы бы вернули объект PropertyInfo для предложения orderby. Скорее всего, это несовместимо с желаемым деревом выражений. Вы можете посмотреть Dynamic LINQ .

... это отрывок из Dynamic LINQ .

public static IQueryable OrderBy(this IQueryable source, 
                                      string ordering, 
                                      params object[] values) {
    if (source == null) throw new ArgumentNullException("source");
    if (ordering == null) throw new ArgumentNullException("ordering");
    ParameterExpression[] parameters = new ParameterExpression[] {
        Expression.Parameter(source.ElementType, "") };
    ExpressionParser parser = new ExpressionParser(parameters, 
                                                   ordering, 
                                                   values);
    IEnumerable<DynamicOrdering> orderings = parser.ParseOrdering();
    Expression queryExpr = source.Expression;
    string methodAsc = "OrderBy";
    string methodDesc = "OrderByDescending";
    foreach (DynamicOrdering o in orderings) {
        queryExpr = Expression.Call(
            typeof(Queryable), o.Ascending ? methodAsc : methodDesc,
            new Type[] { source.ElementType, o.Selector.Type },
            queryExpr, Expression.Quote(Expression.Lambda(o.Selector, 
                                                          parameters)));
        methodAsc = "ThenBy";
        methodDesc = "ThenByDescending";
    }
    return source.Provider.CreateQuery(queryExpr);
}
15
ответ дан 18 December 2019 в 06:11
поделиться

Измените это:

public static class Extensions
{
    public static IQueryable<T> Sort<T>(this IQueryable<T> query, string sortField, SortDirection direction)
    {
      //code
    }
}

Класс не должен быть универсальным, только ваш метод расширения должен быть:)

8
ответ дан 18 December 2019 в 06:11
поделиться

Ошибка уже сообщает вам:

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

Просто удалите аргумент универсального типа.

public static class Extensions // no <T>
{
    // ...
}
3
ответ дан 18 December 2019 в 06:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: