using System;
using System.Reflection ;
using System.Collections ;
namespace SystemFramwork.Tools
{
/// <summary>
/// SystemTool 的摘要说明。
/// </summary>
public sealed class AutoArrayComparer : System.Collections.IComparer
{
private Type arrayDataType ;
private string propertyName ;
private bool sortFromSmall ;
public AutoArrayComparer(Type arrayDataType,string propertyName,bool isSortFromSmall)
{
this.arrayDataType = arrayDataType ;
this.propertyName = propertyName ;
this.sortFromSmall = isSortFromSmall ;
}
public AutoArrayComparer(Type arrayDataType,string propertyName) : this(arrayDataType,propertyName,true)
{
}
#region IComparer 成员
public int Compare(object x, object y)
{
System.Reflection.PropertyInfo property = arrayDataType.GetProperty(propertyName) ;
if (property == null )
return 0 ;
if (x.GetType().Equals(arrayDataType)==false || y.GetType().Equals(arrayDataType)==false)
return 0 ;
object valuex = property.GetValue(x,null) ;
if (valuex == null )
return 0 ;
Type valueType = valuex.GetType() ;
object valuey = property.GetValue(y,null) ;
try
{
int result = (int)valueType.InvokeMember("CompareTo",
BindingFlags.Default|BindingFlags.InvokeMethod
,null,valuex,new object[1]{(valuey)} ) ;
if (sortFromSmall == false )
result = -result ;
return result ;
}
catch
{
return 0 ;
}
// TODO: 添加 AutoArrayComparer.Compare 实现
}
#endregion
}
public class AutoCollectionSort
{
/// <summary>
/// sort the collction
/// </summary>
/// <param name="collection">the collection want to sort</param>
/// <param name="dataType">the datacollection' data type</param>
/// <param name="sortPropertyName">the sort base the property</param>
/// <param name="isSortFromSmall">is sort by minvalue to maxvalue</param>
/// <returns>the sorted collection </returns>
public static void Sort( CollectionBase collection , Type dataType , string sortPropertyName , bool isSortFromSmall)
{
if (collection == null || dataType==null )
return ;
ArrayList tempArray = new ArrayList() ;
tempArray.AddRange(collection) ;
AutoArrayComparer comparer = new AutoArrayComparer(dataType,sortPropertyName, isSortFromSmall) ;
tempArray.Sort(comparer) ;
// CollectionBase result = (CollectionBase)Activator.CreateInstance(collection.GetType()) ;
collection.Clear() ;
foreach(object o in tempArray)
{
((IList)collection).Add(o) ;
}
// collection = result ;
}
public static void Sort( CollectionBase collection , Type dataType , string sortPropertyName )
{
Sort(collection,dataType,sortPropertyName,true) ;
}
}
}