using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.ComponentModel; using System.Collections; namespace ProductionControl.UI.PropExtend { [AttributeUsage(AttributeTargets.Property)] public class PropertyOrderAttribute : Attribute//自定义Attribute类,向property提供 { private int order; public PropertyOrderAttribute(int order) { this.order = order; } public int Order { get { return order; } } } #region Helper Class - PropertyOrderPair public class PropertyOrderPair : IComparable { private int _order; private string _name; public string Name { get { return _name; } } public PropertyOrderPair(string name, int order) { _order = order; _name = name; } public int CompareTo(object obj) { // // Sort the pair objects by ordering by order value // Equal values get the same rank // int otherOrder = ((PropertyOrderPair)obj)._order; if (otherOrder == _order) { // // If order not specified, sort by name // string otherName = ((PropertyOrderPair)obj)._name; return string.Compare(_name, otherName); } else if (otherOrder > _order) { return -1; } return 1; } } #endregion class TestPropertyDescriptor : PropertyDescriptor, IComparable//继承PropertyDescriptor类并实现IComparable接口 { private PropertyDescriptor basePropertyDescriptor; private int order; //构造函数 public TestPropertyDescriptor(PropertyDescriptor basePropertyDescriptor) : base(basePropertyDescriptor) { this.basePropertyDescriptor = basePropertyDescriptor; order = GetOrder(basePropertyDescriptor.Attributes); } //获得property的order属性 private int GetOrder(AttributeCollection ac) { foreach (Attribute a in ac) { if (a is PropertyOrderAttribute) return ((PropertyOrderAttribute)a).Order; } return 0; } #region "IComparable" public int CompareTo(object tpd)//实现接口,使此类的对象可以依据order进行比较、排序 { TestPropertyDescriptor other = (TestPropertyDescriptor)tpd; if (order == other.order) return string.Compare(Name, other.Name); else return (order > other.order) ? 1 : -1; } public override bool CanResetValue(object component) { return false; } public override Type ComponentType { get { return this.GetType(); } } public override object GetValue(object component) { return component; } public override bool IsReadOnly { get { return false; } } public override Type PropertyType { get { return this.GetType(); } } public override void ResetValue(object component) { //不重置,无动作 } public override void SetValue(object component, object value) { ; } /// /// 是否应该持久化保存 /// /// /// public override bool ShouldSerializeValue(object component) { return false; } /// /// 属性说明 /// public override string Description { get { return this.Description; } } #endregion } class ICustomTDClass1 : ICustomTypeDescriptor//Class1为需要对其属性进行排序的自定义类。 { public PropertyDescriptorCollection GetProperties(Attribute[] attributes) { PropertyDescriptorCollection tmpPDC = TypeDescriptor.GetProperties(typeof(ICustomTDClass1), attributes); PropertyDescriptorCollection result = new PropertyDescriptorCollection(null); ArrayList orderPdList = new ArrayList(); foreach (PropertyDescriptor pd in tmpPDC) { TestPropertyDescriptor tpd = new TestPropertyDescriptor(pd); result.Add(tpd); orderPdList.Add(tpd); } orderPdList.Sort();//根据order排序 ArrayList propertyNames = new ArrayList(); foreach (TestPropertyDescriptor propertyAttributes in orderPdList)//获得排序后的DisplayName数组 { propertyNames.Add(propertyAttributes.DisplayName); } return result.Sort((string[])propertyNames.ToArray(typeof(string)));//根据数组对结果排序,注意这里不能直接return } public AttributeCollection GetAttributes() { return TypeDescriptor.GetAttributes(this, true); } public string GetClassName() { return TypeDescriptor.GetClassName(this, true); } public string GetComponentName() { return TypeDescriptor.GetClassName(this, true); } public TypeConverter GetConverter() { return TypeDescriptor.GetConverter(this, true); } public EventDescriptor GetDefaultEvent() { return TypeDescriptor.GetDefaultEvent(this, true); } public PropertyDescriptor GetDefaultProperty() { return TypeDescriptor.GetDefaultProperty(this, true); } public object GetEditor(Type editorBaseType) { return TypeDescriptor.GetEditor(this, editorBaseType, true); } public EventDescriptorCollection GetEvents(Attribute[] attributes) { return TypeDescriptor.GetEvents(this, attributes, true); } public EventDescriptorCollection GetEvents() { return TypeDescriptor.GetEvents(this, true); } public PropertyDescriptorCollection GetProperties() { return TypeDescriptor.GetProperties(this, true); } public object GetPropertyOwner(PropertyDescriptor pd) { return this; } } }