2017-01-11 4 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

Попытка отправить PropertyType в качестве первого параметра в Expression.Lambda()

+0

ли вы имеете в виду, как это: 'вара sortExpression = Expression.Lambda > (о, SortProperty, пары);' – MB34

Смежные вопросы