2017-01-11 63 views
0

我有一個通用的排序方法,我們使用並需要擴展它能夠排序不同類型的列表。Expression.Lamda與已知類型?

當我傳入一個列表時,構建sortExpression的代碼將不起作用,因爲列表項是繼承的,因此父類型在T中反映與在o中傳遞的實際類型反映。

任何想法如何使這個工作與傳遞的類型?

public static List<T> Sort<T>(IQueryable<T> list, int sortOrder, string sortColumn, Type o) 
{    
    var param = Expression.Parameter(o); 
    MemberExpression sortProperty = Expression.Property(param, sortColumn); 
    String propertyType = o.GetProperty(sortColumn).PropertyType.ToString(); 
    switch (propertyType) 
    { 
     case "System.String": 
      { 
       var sortExpression = Expression.Lambda<Func<T, String>>(sortProperty, param); 
       return sortOrder == 0 ? list.OrderBy(sortExpression).ToList() : list.OrderByDescending(sortExpression).ToList(); 
      } 
     case "System.Int32": 
      { 
       var sortExpression = Expression.Lambda<Func<T, Int32>>(sortProperty, param); 
       return sortOrder == 0 ? list.OrderBy(sortExpression).ToList() : list.OrderByDescending(sortExpression).ToList(); 
      } 
     case "System.Decimal": 
      { 
       var sortExpression = Expression.Lambda<Func<T, Decimal>>(sortProperty, param); 
       return sortOrder == 0 ? list.OrderBy(sortExpression).ToList() : list.OrderByDescending(sortExpression).ToList(); 
      } 
    // etc... 
    } 
} 

回答

1

必要時,可以使用Expression.Convert()第一個參數,你可以使用list.ElementType得到的IQueryable的元素的類型。

例如:

public static List<T> Sort<T>(IQueryable<T> list, int sortOrder, string sortColumn, Type o) 
{    
    var param = Expression.Parameter(list.ElementType); 
    MemberExpression sortProperty = Expression.Property(Expression.Convert(param, o), sortColumn); 
    // etc... 
+0

完善。由於系統問題,我無法接受答案。今晚晚些時候會嘗試做。 – MB34

0

嘗試發送屬性類型爲Expression.Lambda()

+0

你的意思是這樣的:'變種的SortExpression = Expression.Lambda >(鄰,sortProperty,PARAM);' – MB34