2015-07-27 7 views
0

Я пытаюсь сделать что-то вроде следующегоДинамические Linq Сортировка не работает для ArrayList

string orderedBy = "item.length"; 

    var sorted = from PPart item in partList 
       orderby orderedBy 
       select item; 

где Partlist находится список массива, содержащий объекты типа PPart. Вышеприведенный оператор не сортирует массивList.

Если я пишу item.length непосредственно в запросе Linq, что-то вроде ниже, то список сортировки

var sorted = from PPart item in partList 
          orderby item.length 
          select item; 

Как я могу сделать динамический LINQ для работы с поздним связыванием

+0

Стандартная LINQ не поддерживает это. – SLaks

+0

SLaks я использую библиотеку "Dynamic Linq" – user2548530

ответ

1

Вы могли сделать это с помощью деревьев выражений, например:

public static Func<PPart, IComparable> GetOrderByPropertyExpression(string propertyName) 
    { 
     ParameterExpression parameter = Expression.Parameter(typeof (PPart)); 
     PropertyInfo baseProperty = typeof (PPart).GetProperty(propertyName); 
     Expression memberExpression = Expression.Property(parameter, baseProperty); 

     return 
      Expression.Lambda<Func<PPart, IComparable>>(Expression.TypeAs(memberExpression, typeof (IComparable)), 
                 parameter).Compile(); 
    } 

И использовать его следующим образом:

IOrderedEnumerable<PPart> ordered = partList.OrderBy(PPart.GetOrderByPropertyExpression("length")); 

Отсутствует проверка ошибок, только концепция.