public void Build(Type type, Hashtable typeDescriptorDictionary) { _attributeCollection.Clear(); _fullName = type.FullName; _name = type.Name; _isArray = type.IsArray; this.Namespace = type.Namespace; ArrayList interfaces = new ArrayList(); foreach (Type typeInterface in type.GetInterfaces()) { if (!typeDescriptorDictionary.Contains(typeInterface)) { TypeDescriptor typeDescriptorTmp = new TypeDescriptor(typeInterface); typeDescriptorDictionary.Add(typeInterface, typeDescriptorTmp); typeDescriptorTmp.Build(typeInterface, typeDescriptorDictionary); } TypeDescriptor typeDescriptor = typeDescriptorDictionary[typeInterface] as TypeDescriptor; interfaces.Add(typeDescriptor); } _interfaces = interfaces.ToArray(typeof(TypeDescriptor)) as TypeDescriptor[]; ArrayList methods = new ArrayList(); foreach(MethodInfo methodInfo in type.GetMethods(BindingFlags.Public|BindingFlags.Instance|BindingFlags.DeclaredOnly)) { if( SkipMethod(methodInfo) ) continue; MethodDescriptor methodDescriptor = new MethodDescriptor(); methodDescriptor.Build(methodInfo); methods.Add(methodDescriptor); } _methods = methods.ToArray(typeof(MethodDescriptor)) as MethodDescriptor[]; PropertyInfo[] propertyInfos = type.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); ArrayList properties = new ArrayList(propertyInfos); int i = 0; for (i = properties.Count - 1; i >= 0; i--) { PropertyInfo propertyInfo = properties[i] as PropertyInfo; if (propertyInfo.GetCustomAttributes(typeof(NonSerializedAttribute), true).Length > 0) properties.RemoveAt(i); if (propertyInfo.GetCustomAttributes(typeof(TransientAttribute), true).Length > 0) properties.RemoveAt(i); if (propertyInfo.GetGetMethod() == null || propertyInfo.GetGetMethod().GetParameters().Length > 0) properties.RemoveAt(i); } ArrayList tmp = new ArrayList(properties.Count); foreach (PropertyInfo propertyInfo in properties) { if (!typeDescriptorDictionary.Contains(propertyInfo.PropertyType)) { TypeDescriptor typeDescriptorTmp = new TypeDescriptor(propertyInfo.PropertyType); typeDescriptorDictionary.Add(propertyInfo.PropertyType, typeDescriptorTmp); typeDescriptorTmp.Build(propertyInfo.PropertyType, typeDescriptorDictionary); } TypeDescriptor typeDescriptor = typeDescriptorDictionary[propertyInfo.PropertyType] as TypeDescriptor; PropertyDescriptor propertyDescriptor = new PropertyDescriptor(propertyInfo.Name, typeDescriptor); tmp.Add(propertyDescriptor); } _properties = tmp.ToArray(typeof(PropertyDescriptor)) as PropertyDescriptor[]; FieldInfo[] fieldInfos = type.GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); ArrayList fields = new ArrayList(fieldInfos); for (i = fields.Count - 1; i >= 0; i--) { FieldInfo fieldInfo = fields[i] as FieldInfo; if (fieldInfo.GetCustomAttributes(typeof(NonSerializedAttribute), true).Length > 0) fields.RemoveAt(i); if (fieldInfo.GetCustomAttributes(typeof(TransientAttribute), true).Length > 0) fields.RemoveAt(i); } tmp = new ArrayList(fields.Count); foreach (FieldInfo fieldInfo in fields) { if (!typeDescriptorDictionary.Contains(fieldInfo.FieldType)) { TypeDescriptor typeDescriptorTmp = new TypeDescriptor(fieldInfo.FieldType); typeDescriptorDictionary.Add(fieldInfo.FieldType, typeDescriptorTmp); typeDescriptorTmp.Build(fieldInfo.FieldType, typeDescriptorDictionary); } TypeDescriptor typeDescriptor = typeDescriptorDictionary[fieldInfo.FieldType] as TypeDescriptor; FieldDescriptor fieldDescriptor = new FieldDescriptor(fieldInfo.Name, typeDescriptor); tmp.Add(fieldDescriptor); } _fields = tmp.ToArray(typeof(FieldDescriptor)) as FieldDescriptor[]; object[] attrs = type.GetCustomAttributes(typeof(System.ComponentModel.DescriptionAttribute), false); if( attrs.Length > 0 ) { System.ComponentModel.DescriptionAttribute descriptionAttribute = attrs[0] as System.ComponentModel.DescriptionAttribute; _description = descriptionAttribute.Description; } attrs = type.GetCustomAttributes(true); if (attrs != null && attrs.Length > 0) { for (i = 0; i < attrs.Length; i++) { Attribute attribute = attrs[i] as Attribute; if (attribute is System.ComponentModel.DescriptionAttribute) continue; AttributeDescriptor attributeDescriptor = new AttributeDescriptor(attribute.GetType().Name); if( !_attributeCollection.Contains(attributeDescriptor.Name) ) _attributeCollection.Add(attributeDescriptor); } } }
private ClassDescriptor(string packageVMName, string name, long stamp, string srcFileName, MethodDescriptor[] methods) { if (packageVMName == null) throw new ArgumentNullException("null input: packageVMName"); if (name == null) throw new ArgumentNullException("null input: name"); if (methods == null) throw new ArgumentNullException("null input: methods"); m_packageVMName = packageVMName; m_name = name; m_stamp = stamp; m_srcFileName = srcFileName; m_methods = methods; }
public TypeDescriptor() { _attributeCollection = new AttributeCollection(); _interfaces = new TypeDescriptor[0]; _methods = new MethodDescriptor[0]; _properties = new PropertyDescriptor[0]; _fields = new FieldDescriptor[0]; _isArray = false; }