51 lines
1.6 KiB
C#
51 lines
1.6 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Reflection;
|
|
|
|
namespace DTS.Common.Utilities
|
|
{
|
|
public class PropertyComparer<T> : IComparer<T>
|
|
{
|
|
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<T> 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);
|
|
}
|
|
}
|
|
}
|