2010-04-01 58 views
2

我怎樣才能讓一個擴展方法,將工作像這樣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)); 

    } 
} 

目前,上面寫着「擴展方法必須在非泛型靜態類中定義」。

我該怎麼做?

回答

12

嘗試......(但我不知道它會做你想要什麼。)

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); 
} 
+0

感謝您的答案和額外的鏈接......我一直試圖做動態LINQ整個上午,不知道我真的在做什麼。 不能說我現在真的做,要麼...需要做一些閱讀所有這一切。 再次感謝! – Micah 2010-04-01 20:01:42

+0

我想我們都已經在那裏了:o)...祝你好運! – 2010-04-01 20:03:57

+0

順便說一句,這段代碼在這裏http://stackoverflow.com/questions/41244/dynamic-linq-orderby確實也有幫助 – Micah 2010-04-01 20:07:41

8

更改此:

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

這個班是非通用的,只是你的擴展方法應該是:)

3

錯誤已經告訴你:

擴展方法必須在非通用靜態類中定義。

只需刪除泛型類型參數即可。

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

這個將不會解決問題,該方法還需要添加通用參數:'Sort ' – 2010-04-01 18:37:50

+1

它至少可以解決* one *問題。也許它教導別人實際閱讀錯誤信息......不,我在開玩笑。 – Thomas 2010-04-01 18:51:10

+0

別擔心......只是移動泛型參數不會解決他很快會發現的問題。 – 2010-04-01 18:52:08

相關問題