public PropertyDescriptorCollection GetProperties(Attribute[] attributes) { PropertyDescriptorCollection _properties; IClassInstance ci = _owner as IClassInstance; if (ci != null) { _properties = ci.GetInstanceProperties(new Attribute[] { }); if (_pointer.IsXType != EnumXType.None) { //remove Name property for (int i = 0; i < _properties.Count; i++) { if (string.CompareOrdinal(_properties[i].Name, "Name") == 0) { _properties.Remove(_properties[i]); break; } } //add Name property PropertyDescriptorCollection ps = TypeDescriptor.GetProperties(_pointer.ObjectInstance, true); foreach (PropertyDescriptor p in ps) { if (string.CompareOrdinal(p.Name, "Name") == 0) { Attribute[] attrs; if (p.Attributes != null) { attrs = new Attribute[p.Attributes.Count]; p.Attributes.CopyTo(attrs, 0); } else { attrs = new Attribute[] { }; } _properties.Add(new PropertyDescriptorXName(this, p, attrs)); break; } } } List <PropertyClassDescriptor> cps = _pointer.CustomProperties; if (cps != null && cps.Count > 0) { for (int i = 0; i < cps.Count; i++) { _properties.Add(cps[i]); } } } else { _properties = _pointer.Properties; } _constructor = new ConstructorInstance(this); if (_pointer.Definition != null) { List <ConstructorClass> ccs = _pointer.Definition.GetConstructors(); if (ccs != null && ccs.Count > 0) { if (ccs.Count == 1 && ccs[0].ParameterCount == 0) { } else { _constructor.SetConstructor(ccs[0]); PropertyDescriptorConstructorInstance pconstruct = new PropertyDescriptorConstructorInstance(this); _properties.Add(pconstruct); } } } return(_properties); }