Dynamic List sorting via reflection (C#)

Dynamic List sorting via reflection (C#)

These methods allow the developer to sort generic list of objects based on any simple property(int, string, bool etc) of the object.

private static List DynamicSort(List genericList, string sortExpression, string sortDirection)
{
if(!string.IsNullOrEmpty(sortExpression))
{
int sortReverser = sortDirection.ToLower().StartsWith("asc") ? 1 : -1;

Comparison comparisonDelegate =
new Comparison(delegate(T x, T y)
{
MethodInfo compareToMethod = GetCompareToMethod(x, sortExpression);

object xSortExpressionValue = x.GetType().GetProperty(sortExpression).GetValue(x, null);
object ySortExpressionValue = y.GetType().GetProperty(sortExpression).GetValue(y, null);

object result = compareToMethod.Invoke(xSortExpressionValue, new object[] { ySortExpressionValue });

return sortReverser * Convert.ToInt16(result);
});

genericList.Sort(comparisonDelegate);
}
return genericList;
}

private static MethodInfo GetCompareToMethod(T genericInstance, string sortExpression)
{
Type genericType = genericInstance.GetType();
object sortExpressionValue = genericType.GetProperty(sortExpression).GetValue(genericInstance, null);
Type sortExpressionType = sortExpressionValue.GetType();
MethodInfo compareToMethodOfSortExpressionType = sortExpressionType.GetMethod("CompareTo", new Type[] { sortExpressionType });

return compareToMethodOfSortExpressionType;
}

Read the rest of this entry »