using System.Reflection; using System.Collections.Generic; using System.Collections; using System; /// /// 继承IComparer接口,实现同一自定义类型 对象比较 /// /// T为泛用类型 public class Reverser : IComparer { private Type type = null; private ReverserInfo info; /// /// 构造函数 /// /// 进行比较的类类型 /// 进行比较对象的属性名称 /// 比较方向(升序/降序) public Reverser(Type type, string name, ReverserInfo.Direction direction) { this.type = type; this.info.name = name; if (direction != ReverserInfo.Direction.ASC) this.info.direction = direction; } /// /// 构造函数 /// /// 进行比较的类名称 /// 进行比较对象的属性名称 /// 比较方向(升序/降序) public Reverser(string className, string name, ReverserInfo.Direction direction) { try { this.type = Type.GetType(className, true); this.info.name = name; this.info.direction = direction; } catch (Exception e) { throw new Exception(e.Message); } } /// /// 构造函数 /// /// 进行比较的类型的实例 /// 进行比较对象的属性名称 /// 比较方向(升序/降序) public Reverser(T t, string name, ReverserInfo.Direction direction) { this.type = t.GetType(); this.info.name = name; this.info.direction = direction; } //必须!实现IComparer的比较方法。 int IComparer.Compare(T t1, T t2) { object x = this.type.InvokeMember(this.info.name, BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty, null, t1, null); object y = this.type.InvokeMember(this.info.name, BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty, null, t2, null); if (this.info.direction != ReverserInfo.Direction.ASC) Swap(ref x, ref y); return (new CaseInsensitiveComparer()).Compare(x, y); } //交换操作数 private void Swap(ref object x, ref object y) { object temp = null; temp = x; x = y; y = temp; } } /// /// 对象比较时使用的信息类 /// public struct ReverserInfo { /// /// 比较的方向,如下: /// ASC:升序 /// DESC:降序 /// public enum Direction { ASC = 0, DESC, }; public enum Target { CUSTOMER = 0, FORM, FIELD, SERVER, }; public string name; public Direction direction; public Target target; }