Я пытаюсь создать некоторый код для динамической сортировки Linq IQueryable < > .
Очевидный способ здесь, который сортирует список, используя строку для имени поля
http://dvanderboom.wordpress.com/2008/12/19/dynamically-composing-linq-orderby-clauses/
Тем не менее, я хочу одно изменение - время компиляции имен полей и возможность использования рефакторинга /Find All References для поддержки последующего обслуживания. Это означает, что я хочу определить поля как f = > f.Name, а не как строки.
Для моего конкретного использования я хочу инкапсулировать некоторый код, который будет определять, какой из списков названных выражений "OrderBy" должен использоваться на основе пользовательского ввода, не записывая каждый раз каждый код.
Вот суть того, что я написал:
var list = from m Movies select m; // Get our list
var sorter = list.GetSorter(...); // Pass in some global user settings object
sorter.AddSort("NAME", m=>m.Name);
sorter.AddSort("YEAR", m=>m.Year).ThenBy(m=>m.Year);
list = sorter.GetSortedList();
...
public class Sorter<TSource>
...
public static Sorter<TSource> GetSorter(this IQueryable<TSource> source, ...)
Функция GetSortedList определяет, какой из названных видов использовать, что приводит к объекту List, где каждая FieldData содержит значения MethodInfo и Type для полей, переданных в AddSort:
public SorterItem<TSource> AddSort(Func<T, TKey> field)
{
MethodInfo ... = field.Method;
Type ... = TypeOf(TKey);
// Create item, add item to diction, add fields to item List<>
// The item has the ThenBy method, which just adds another field to the List<>
}
Я не уверен, есть ли способ сохранить весь объект поля таким образом, чтобы он мог быть возвращен позже (его невозможно было бы отличить, поскольку это общий тип)
Можно ли адаптировать образец кода или создать совершенно новый код для сортировки с использованием строго типизированных имен полей после, они были сохранены в некотором контейнере и получены (потеря любой родовой тип)