Home
Manage Your Code
Snippet: Dynamic List sorting via reflection (C#)
Title: Dynamic List sorting via reflection Language: C#
Description: These methods allow the developer to sort generic list of objects based on any simple property(int, string, bool etc) of the object. Views: 994
Author: Alper Sunar Date Added: 12/6/2007
Copy Code  
1        private static List<T> DynamicSort<T>(List<T> genericList, string sortExpression, string sortDirection)
2        {
3            int sortReverser = sortDirection.ToLower().StartsWith("asc") ? 1 : -1;
4
5            Comparison<T> comparisonDelegate = 
6                new Comparison<T>(delegate(T x, T y)
7                                    {
8                                        MethodInfo compareToMethod = GetCompareToMethod<T>(x, sortExpression);
9
10                                        object xSortExpressionValue = x.GetType().GetProperty(sortExpression).GetValue(x, null);
11                                        object ySortExpressionValue = y.GetType().GetProperty(sortExpression).GetValue(y, null);
12
13                                        object result = compareToMethod.Invoke(xSortExpressionValue, new object[] { ySortExpressionValue });
14
15                                        return sortReverser * Convert.ToInt16(result);
16                                    });
17
18
19            genericList.Sort(comparisonDelegate);
20
21            return genericList;
22        }
23
24
25        private static MethodInfo GetCompareToMethod<T>(T genericInstance, string sortExpression)
26        {
27            Type genericType = genericInstance.GetType();
28            object sortExpressionValue = genericType.GetProperty(sortExpression).GetValue(genericInstance, null);
29            Type sortExpressionType = sortExpressionValue.GetType();
30            MethodInfo compareToMethodOfSortExpressionType = sortExpressionType.GetMethod("CompareTo", new Type[] { sortExpressionType });
31
32            return compareToMethodOfSortExpressionType;             
33        }
34
Usage
//Let's assume we have a Person object with Id(int), Name(string) and
//BirthDate(datetime). 


List personList = GetPersons();

//Property names are case sensitive
List personListSortedById = DynamicSort(personList, "Id", "Ascending");
List personListSortedByName = DynamicSort(personList, "Name", "Ascending");