using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Reflection; namespace DTS.Common.Utilities { public class PropertyComparer : IComparer { private readonly IComparer _comparer; private PropertyDescriptor _propertyDescriptor; private int _reverse; public PropertyComparer(PropertyDescriptor property, ListSortDirection direction) { _propertyDescriptor = property; var comparerForPropertyType = typeof(Comparer<>).MakeGenericType(property.PropertyType); _comparer = (IComparer) comparerForPropertyType.InvokeMember("Default", BindingFlags.Static | BindingFlags.GetProperty | BindingFlags.Public, null, null, null); SetListSortDirection(direction); } #region IComparer Members public int Compare(T x, T y) { return _reverse * _comparer.Compare(_propertyDescriptor.GetValue(x), _propertyDescriptor.GetValue(y)); } #endregion private void SetPropertyDescriptor(PropertyDescriptor descriptor) { _propertyDescriptor = descriptor; } private void SetListSortDirection(ListSortDirection direction) { _reverse = direction == ListSortDirection.Ascending ? 1 : -1; } public void SetPropertyAndDirection(PropertyDescriptor descriptor, ListSortDirection direction) { SetPropertyDescriptor(descriptor); SetListSortDirection(direction); } } }