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