我正在尝试构建一些用于动态排序Linq IQueryable 的代码。最明显的方法是在这里,它使用字符串作为字段名称对列表进行排序 http://dvanderboom.wordpress.com/2008/12/19/dynamically-composing-linq-orderby-clauses/但是我想要一个更改-编译字段名称的时间检查,以及使用重构/查找所有引用来支持以后维护的能力。这意味着我想将字段定义为f => f.Name,而不是字符串。对于我的特定用途,我想封装一些代码,这些代码将根据用户输入来确定应使用命名的“OrderBy”表达式列表中的哪个,而不必每次都编写不同的代码。这是我写的要点:var list = from m Movies select m; // Get our listvar sorter = list.GetSorter(...); // Pass in some global user settings objectsorter.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包含在AddSort中传递的字段的MethodInfo和Type值:public SorterItem<TSource> AddSort(Func<T, TKey> field){ MethodInfo ... = field.Method; Type ... = TypeOf(TKey); // Create item, add item to diction, add fields to item's List<> // The item has the ThenBy method, which just adds another field to the List<>}我不确定是否有一种方法可以存储整个字段对象,以便以后可以返回它(由于它是泛型类型,因此无法进行转换)有没有一种方法可以适应示例代码,或者提供全新的代码,以便在将强类型字段名称存储在某个容器中并进行检索之后进行排序(使用任何泛型类型转换) 最佳答案 最简单的方法是让您的AddSort()函数采用Expression >而不是Func。这使您的排序方法可以检查Expression,以提取要排序的属性的名称。然后,您可以在内部将该名称存储为字符串,因此存储非常容易,并且可以使用链接到的排序算法,但是您还可以获得类型安全性和编译时检查的有效属性名称。static void Main(string[] args){ var query = from m in Movies select m; var sorter = new Sorter<Movie>(); sorter.AddSort("NAME", m => m.Name);}class Sorter<T>{ public void AddSort(string name, Expression<Func<T, object>> func) { string fieldName = (func.Body as MemberExpression).Member.Name; }}在这种情况下,我将对象用作函数的返回类型,因为它可以轻松自动转换,但是如果需要更多功能,则可以根据需要使用其他类型或泛型来实现。在这种情况下,由于只对表达式进行检查,因此它并不重要。另一种可能的方法是仍然使用Func,并将其存储在字典本身中。然后,当涉及到排序时,您需要获取要排序的值,您可以调用以下内容:// assuming a dictionary of fields to sort for, called m_fieldsm_fields[fieldName](currentItem)关于c# - 强类型动态Linq排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/557819/
10-10 15:34