IQueryable <t>扩展方法不起作用</t>

时间:2010-04-01 18:32:36

标签: c# linq extension-methods

如何制作一个像这样的

的扩展方法
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));

    }
}

目前说“扩展方法必须在非泛型静态类中定义”。

我该怎么做?

3 个答案:

答案 0 :(得分:14)

试试这个......(但我不确定它能做你想做的事。)

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<T>移动到Sort<T>(将允许您摆脱您遇到的编译器错误。

至于您尝试使用反射做什么,您将返回orderby子句的PropertyInfo对象。这很可能与您想要的表达式树不兼容。您可能需要查看 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);
}

答案 1 :(得分:8)

改变这个:

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

该类必须是非泛型的,只需要扩展方法:)

答案 2 :(得分:3)

错误已经告诉你:

  

扩展方法必须在非泛型静态类中定义。

只需删除泛型类型参数。

public static class Extensions // no <T>
{
    // ...
}