Sorting GridView using IComparer and Reflection
Recently I just did a small job for a client online using IComparer interface to perform sorting on a GridView control.
First I need to create class called Person. This class is going to contain the following properties: FirstName, LastName, Age.
public class Person { private string _firstName; private string _lastName; private int _age; public string FirstName { get { return _firstName; } set { _firstName = value; } } public string LastName { get { return _lastName; } set { _lastName = value; } } public int Age { get { return _age; } set { _age = value; } } }
Now I need to create a class called PersonComparer that will inherit from the IComparer interface. This comparer class will be use with the Sort() method from a List collection.
using System.Collections; using System.Collections.Generic; using System.Reflection; using System; public class PersonComparer:IComparer { private string _sortBy; public string SortBy { get { return _sortBy; } set { _sortBy = value; } } public int Compare(Person x, Person y) { int result = 0; string propName = string.Empty; string sortDirection = "ASC"; if (_sortBy.Contains(" DESC")) { propName = _sortBy.Replace(" DESC", string.Empty).Trim(); sortDirection = "DESC"; } if (_sortBy.Contains(" ASC")) { propName = _sortBy.Replace(" ASC", string.Empty).Trim(); sortDirection = "ASC"; } // Get type of Person Object Type t = typeof(Person); // Find the property name from the sortExpress passed in SortBy property. PropertyInfo propInfo = t.GetProperty(propName); if (propInfo != null) { // Perform comparison on property value. result = Comparer.DefaultInvariant.Compare(propInfo.GetValue(x, null), propInfo.GetValue(y, null)); if (sortDirection.Equals("DESC")) { result = -result; } } return result; } }