private MetaType(Type type) { this._type = type; this._isComplex = TypeUtility.IsComplexType(type); // enumerate all properties and initialize property level info List<PropertyDescriptor> includedAssociations = new List<PropertyDescriptor>(); foreach (PropertyDescriptor pd in TypeDescriptor.GetProperties(type)) { MetaMember metaMember = new MetaMember(this, pd); if (pd.Attributes[typeof(ExcludeAttribute)] == null) { bool isPredefinedType = TypeUtility.IsPredefinedType(pd.PropertyType); metaMember.IsCollection = TypeUtility.IsSupportedCollectionType(pd.PropertyType); bool isComplex = TypeUtility.IsSupportedComplexType(pd.PropertyType); metaMember.IsDataMember = isPredefinedType || isComplex; metaMember.IsComplex = isComplex; metaMember.RequiresValidation = pd.Attributes.OfType<ValidationAttribute>().Any(); } if (pd.Attributes[typeof(AssociationAttribute)] != null) { if (pd.Attributes.OfType<IncludeAttribute>().Any(p => !p.IsProjection)) { includedAssociations.Add(pd); } metaMember.IsAssociationMember = true; } IncludeAttribute[] memberProjections = pd.Attributes.OfType<IncludeAttribute>().Where(p => p.IsProjection).ToArray(); if (memberProjections.Length > 0) { this._projectionMemberMap[pd] = memberProjections; } if (pd.Attributes[typeof(CompositionAttribute)] != null) { this._hasComposition = true; } this._metaMembers.Add(pd.Name, metaMember); } this._includedAssociations = new PropertyDescriptorCollection(includedAssociations.ToArray(), true); this.CalculateAttributesRecursive(type, new HashSet<Type>()); }